目录
一维数组
题目
请先自己将题目分析完
运行结果
答案
题解
1.a,在sizeof函数内部单独出现的数组名,表示的不再是数组首元素地址,而是整个数组,计算的是整个数组的大小 4 * 4 = 16个字节(sizeof(数组名)数组名表示整个数组,计算的是整个数组的大小)
2.a+0,此处数组名代表首元素地址,+0依旧表示首元素地址,地址的大小为 4 / 8个字节
3.*a,此处数组名代表首元素地址,解引用为数组首元素,即为4个字节
4..a+1,此处数组名代表首元素地址,地址+1指向数组第二个元素,即为4个字节
5.a[1],代表数组第二个元素,为4个字节
6.&a,此处取出数组地址,即为4/8个字节(&(数组名)取出的是整个数组的地址,不是首元素地址)
7.*&a,*与&符号互相消去(就像+和-)故此处为数组地址,即为16个字节
8.&a+1,取出a数组的地址并+1,跳过整个数组,但它只要是地址,大小就为4/8个字节
9.&a[0],取出数组首元素地址,是地址,大小为4/8个字节
10.&a[0]+1,取出数组首元素地址并+1指向数组第二个元素,是地址,大小为4/8个字节
字符数组
题目
sizeof
单个存放字符
连续存放字符
字符串常量首字符地址赋值给指针变量p
strlen
单个存放字符
连续存放字符
字符串常量首字符地址赋值给指针变量p
运行结果
sizeof
单个存放字符
连续存放字符
字符串常量首字符地址赋值给指针变量p
strlen
单个存放字符
连续存放字符
字符串常量首字符地址赋值给指针变量p
答案
sizeof
单个存放字符
连续存放字符
字符串常量首字符地址赋值给指针变量p
strlen
单个存放字符
连续存放字符
字符串常量首字符地址赋值给指针变量p
题解
sizeof
单个存放字符
1.sizeof(arr),sizeof函数内部单独存放数组名,计算的是整个数组的大小1 * 6 = 6个字节
2.sizeof(arr+0),sizeof内部存放数组首元素地址+1,指向数组第二个元素,是地址,即为4/8个字节
3.*arr,对数组首元素地址解引用为数组首元素,即为1个字节
4.arr[1],对arr数组下标为一的元素的地址解引用为数组第二个元素,即为1个字节
5.&arr,取出整个数组的地址,是地址,即为4/8个字节
6.&arr+1,取出整个数组的地址+1,跳过整个数组,但还是地址,即为4/8个字节
7.&arr[0]+1,取出数组首元素地址+1,跳过一个数组元素指向数组第二个元素,是地址,即为4/8个字节
连续存放字符
1.sizeof(arr),sizeof函数内部单独存放数组名,计算的是整个数组的大小,因为这里是连续存放,在字符串末尾还有一个'\0',故为1 * 7 = 7个字节
2..sizeof(arr+0),sizeof内部存放数组首元素地址+1,指向数组第二个元素,是地址,即为4/8个字节
3.*arr,对数组首元素地址解引用为数组首元素,即为1个字节
4..arr[1],对arr数组下标为一的元素的地址解引用为数组第二个元素,即为1个字节
5..&arr,取出整个数组的地址,是地址,即为4/8个字节
6..&arr+1,取出整个数组的地址+1,跳过整个数组,但还是地址,即为4/8个字节
7.&arr[0]+1,取出数组首元素地址+1,跳过一个数组元素指向数组第二个元素,是地址,即为4/8个字节
字符串常量首字符地址赋值给指针变量p
1.p,是一个指针变量,即为4/8个字节
2.p+1,字符串首元素地址+1表示第二个元素的地址,是地址,即为4/8个字节
3.*p,对字符串首元素地址解引用为字符串首元素,即为1个字节
4.arr[1],对arr数组下标为一的元素的地址解引用为数组第二个元素,即为1个字节
5.&arr,取出整个数组的地址,是地址,即为4/8个字节
6.&arr+1,取出整个数组的地址+1,跳过整个数组,但还是地址,即为4/8个字节
7.&arr[0]+1,取出数组首元素地址+1,跳过一个数组元素指向数组第二个元素,是地址,即为4/8个字节
strlen
单个存放字符
1.strlen(arr),arr为数组首元素地址,strlen计算'\0'之前有效字符个数,因为字符单个存放,'\0'不确定出现在什么位置,故为随机值
2.strlen(arr+0),arr+0为数组首元素地址,strlen计算'\0'之前有效字符个数,因为字符单个存放,'\0'不确定出现在什么位置,故为随机值
3.*arr,对数组首元素地址解引用为数组首元素,strlen的参数为地址,将数组首元素的ASCII码值当作地址,非法访问
4.arr[1],对arr数组下标为一的元素的地址解引用为数组第二个元素,strlen的参数为地址,将数组第二个元素的ASCII码值当作地址,非法访问
5.&arr,取出整个数组的地址(此处也可称呼为数组首元素地址,因为数组地址和数组首元素地址的值是相同的,不过类型不同,这里用不到类型的概念,故相同),将数组内所有元素计算在内,'\0'不确定出现在什么位置,故为随机值
6.&arr+1,取出整个数组的地址+1,跳过整个数组,然后开始计算'\0'之前的有效字符个数,'\0'不确定出现在什么位置,但又因为跳过数组arr,故为随机值-6
7.&arr[0]+1,取出数组首元素地址+1,跳过一个数组元素指向数组第二个元素,然后开始计算'\0'之前的有效字符个数,'\0'不确定出现在什么位置,故为随机值-1
连续存放字符
1.strlen(arr),arr为数组首元素地址,strlen计算'\0'之前有效字符个数,因为这里是连续存放,在字符串末尾还有一个'\0',故为6
2.strlen(arr+0),arr+0为数组首元素地址,strlen计算'\0'之前有效字符个数,因为这里是连续存放,在字符串末尾还有一个'\0',故为6
3.*arr,对数组首元素地址解引用为数组首元素,strlen的参数为地址,将数组首元素的ASCII码值当作地址,非法访问
4.arr[1],对arr数组下标为一的元素的地址解引用为数组第二个元素,strlen的参数为地址,将数组第二个元素的ASCII码值当作地址,非法访问
5.&arr,取出整个数组的地址(此处也可称呼为数组首元素地址,因为数组地址和数组首元素地址的值是相同的,不过类型不同,这里用不到类型的概念,故相同),将数组内所有元素计算在内,在字符串末尾还有一个'\0',故为6
6.&arr+1,,取出整个数组的地址+1,跳过整个数组,然后开始计算'\0'之前的有效字符个数,'\0'不确定出现在什么位置,但又因为跳过数组arr,故为随机值
7.&arr[0]+1,取出数组首元素地址+1,跳过一个数组元素指向数组第二个元素,然后开始计算'\0'之前的有效字符个数,在字符串末尾还有一个'\0',故为5
字符串常量首字符地址赋值给指针变量p
1.p,是一个指针变量,存储数组首元素地址,计算'\0'之前的有效字符个数,在字符串末尾还有一个'\0',故为6
2.p+1,字符串首元素地址+1指向第二个元素,计算'\0'之前的有效字符个数,故为5
3.对字符串首元素地址解引用为数组串首元素,strlen的参数为地址,将数组首元素的ASCII码值当作地址,非法访问
4.对字符串首元素下标为0的元素的地址解引用为数组第1个元素,strlen的参数为地址,将数组第1个元素的ASCII码值当作地址,非法访问
5.&p,取出p的地址而不是字符串首元素地址,计算'\0'之前的有效字符个数,'\0'不确定出现在什么位置,故为随机值
6.&(p+1),取出p的地址+1,跳过一个char*p大小的空间,因为不确定里面是否有'\0',故值与5的值无关系,故为随机值
7.&p[0]+1,取出字符串首元素地址+1,跳过一个元素,计算'\0'之前的有效字符个数,在字符串末尾还有一个'\0',故为5
二维数组
题目
运行结果
答案
题解
1.sizeof(a),sizeof函数内部单独存放数组名,计算的是整个数组的大小,即为48个字节
2.a[0][0],为数组第一行第一列元素,即为4个字节
3.a[0],为数组第一行首元素地址,单独存放在sizeof函数内部,计算的是第一行所有元素的大小,即为4*4=16个字节
4.a[0]+1,a[0]为第一行首元素地址,+1为第一行第2列元素地址,是地址,即为4/8个字节
5.*(a[0]+1),a[0]为第一行首元素地址,+1为第一行第2列元素地址,解引用为数组第一行第二列的元素,即为4个字节
6.a+1,a为数组第一行地址,+1为数组第二行地址,是地址,即为4/8个字节
7.*(a+1),a为数组第一行地址,+1为数组第二行地址,解引用为数组第二行元素,即为4*4=16个字节
8.&a[0]+1,取出数组第一行地址,+1为数组第二行地址,是地址,即为4/8个字节
9.*(&a[0]+1),取出数组第一行地址,+1为数组第二行地址,解引用为数组第二行元素,即为4*4=16个字节
10.*a,解引用数组第一行地址,即为4*4=16个字节
11.a[3],看似a[3]越界访问,但是却可以正常输出16,因为sizeof内部不会真正进行计算,sizeof会根据参数类型推断而出,故a[3]为16个字节
结尾
感谢认真观看完全文,如有发现错误,请指出,作者校正后会加以改正
最后,祝各位道友早日突破/进阶