数组以及内存分配
一:const和define的区别
1.
define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
2.
define宏没有类型,不做任何类型检查,仅仅是展开。
const常量有具体的类型,在编译阶段会执行类型检查。
3.
define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
const常量会在内存中分配(可以是堆中也可以是栈中)。
4.
const 可以节省空间,避免不必要的内存分配
二.栈是如何分配内存的
栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
数组在定义是分配内存,声明时不分配内存,大小在编译期就做为常数确定下来,分配的最大内存与栈有关。
三:sizeof()
1.sizeof不是函数,它是运算符,sizeof(数组名)得到的是数组的长度
2.sizeof(c++)没有计算
eg:int c=10;
printf("%d/n“。sizeof(c++));
printf("c==%d/n,c");
输出的结果为:4
c==10
四:数组作为函数参数
数组元素作函数实参:数组元素就是下标变量,和普通变量没有区别, 因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。
数组名作为函数参数用数组名作函数参数与用数组元素作实参有几点不同。
1) 用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的。因此,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变量对待的
2) 在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值传送是把实参变量的值赋予形参变量。在用数组名作函数参数时,不是进行值的传送,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。那么,数据的传送是如何实现的呢?在我们曾介绍过,数组名就是数组的首地址。因此在数组名作函数参数时所进行的传送只是地址的传送,也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。
五,数组和指针之间访问数组内的元素
&arr:指的是第一个数组元素的储存地址
&arr+1:指的是最后一个元素的下一个地址
*(arr):指的是数组的第一个元素值
*(arr+1):指的是数组第二个元素的值
&arr与arr的区别在于arr是数组对象,&arr是指针类型。
六:字符"0",字符" "和整数0的区别
1.字符"0":他的ASCII妈是484
2.字符" ":ASCII码为0,表示一个字符串结束,是转义字符
3.整数0:字符表示为空字符
- 上一篇: 一维数组内存分析及数组元素的创建和使用
- 下一篇: 数组的基本认识及内存分配