1、对于数组arr,那么arr和&arr的区别是什么呢?
C/C++里面的数组名字会退化为指针,所以数组名arr实际指的是数组的第一个元素的地址。而数组名作为指针来讲有特殊性,它正在它所指向的内存区域中,&arr的值和arr的数值是相同的(可以输出观察一下),但是类型和意义不同。而指针的加法操作和指向的数据类型密切相关。
arr指的是数组对象,指代整个数组,arr在多数情况下会隐式转换成&(arr[0])为指针类型。&arr为指针类型,指的是数组首元素的地址。arr和&arr不同类型,但输出是相同的,原因是arr和arr[0]的地址相同。
在利用sizeof计算数组长度时候,arr和&arr的区别就出来了:
当数组名代表整个数组的时候是在以下两种情况:1.在用sizeof关键字求数组所占的内存大小。2.对数组名取地址时代表整个数组的首地址。
在用sizeof求&arr的内存长度时,他所求的空间长度是指向整个数组的地址的占用空间长度;当对数组名取地址时&arr+1所占的地址与&arr所占的地址相差整个数组所占字节的大小;而arr+1所占的地址与arr所占的地址相差一个元素的字节。
比如:
int a[10]; a就相当于int *,如果是对它加1(a + 1)是相当于a + 1 * sizeof(int)。但是&a的类型则相当于int **,是所谓指向数组的指针,是数组元素类型的二级指针,对它加1是相当于 &a + 1 * sizeof(a)的,所以会偏移一个数组长度。
2、数组什么时候分配内存?什么时候确定大小?
编译的时候只是确定了内存的大小,实际分配还是在运行时分配的,否则无数的C语言程序每一个都分配一段内存却不运行电脑受不了的。
3、字符‘0’字符‘\0’和 整数0 的区别
字符‘0’:char c=’0’ 它的ASCII码实际上是48.
字符‘\0’: ASCII码为0,表示一个字符串结束的标志。这是转义字符。
整数 0 :ASCII码为0,字符表示为空字符,NULL;数值表示为0。
4、 define和const的区别:
(1) 就定义常量说的话:
const 定义的常数是变量也带类型, #define 定义的只是个常数不带类型。
(2) 就起作用的阶段而言:
define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用。
(3) 就起作用的方式而言:
define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。
正因为define只是简单的字符串替换会导致边界效应const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生错误,边界效应。
(4) 从是否可以再定义的角度而言:
const不足的地方,是与生俱来的,const不能重定义,并且在定义的时候一定要进行初始化,而#define可以通过#undef取消某个符号的定义,再重新定义。
5、栈的布局以及存储方式:
栈的布局:数组储存在栈中,在内存中从高地址到低地址增长,栈的特点是先进后出,它只允许在表的一端进行数据的输入,删除操作。放入数据的入口即为栈的栈顶,将数据压入栈后,数据所存在的位置即为栈的栈。它在进行插入和删除工作时必须从栈顶元素入手,即就是先进栈的元素后出栈,即先进后出。添加新元素时,可直接将新元素压在栈顶元素之上,而此时的新元素会代替之前的栈顶元素成为栈顶元素。而进行删除操作时,也必须从栈顶元素入手,如需删除的是栈顶元素,则直接从栈中将栈顶元素取出,那么下一个相邻元素则成为栈顶元素,如果所要删除的数据是非栈顶元素,则需将此元素之前的元素依次取出,然后此元素就变成了栈顶元素,做法同上,然后再将之前取出的元素以取出时的逆顺序依次放入。在VS中有栈保护,称为哨兵位,关于数组最多分配多大内存这与栈的大小有关系即和内存大小有关。
6、数组不能作为左值,数组是聚合类型不能整体赋值。strlrn在计算字符串长度时,不包括"\0"的长度。