首先说明sizeof的作用:sizeof是运算符,分配的数组实际所占的内存空间大小,不受里面存储内容
在一维数组中
//一维数组
int a[] = {1,2,3,4};
求sizeof
a:数组的空间大小
a+0: 相当于a[0],即指向第一个元素的指针 (32位系统指针都是4字节)
*a:数组首元素地址的解引用
a+1:将指针指向下一个元素
&a:数组指针,数组的地址就是数组的首地址
&a+1:跨越了一个数组的长度
&a[0]:指向第一个元素的指针
&a[0] + 1:指向a[1]地址的指针
在字符数组中
//字符数组
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
求sizeof
arr:数组的长度 6
arr+0:指向第一个元素的指针
arr[1]:第二个字符的长度
&arr:数组指针,指向arr数组的首地址,返回值为char
&arr+1:跨越一个数组长度的指针
&arr[0]+1:取arr[1]的地址的指针
字符串数组
//字符串数组
char arr[] = "abcdef";
求sizeof
arr:整个数组长度,包括’\0’ 7
*arr:arr[0]字符长度(‘a’)
若求其strlen(引进string.h头文件
而strlen是函数,计算字符串的长度,以’\0’为字符串结束标志
strlen(arr):6
strlen(*arr):未定义行为
指向字符串的指针
char*p = "abcdef";
求sizeof
p;指针长度
*p:对p进行解引用,指向的是a
&p+1:跨越一个数组的指针
&p[0]+1:指向b的指针
strlen§:6
strlen(p + 1):5 从第二个元素算起
二维数组
int a[3][4] = { 0 };
a:12个元素4个字节=48
a[0]:以a[0][0]为首的一维数组 即第一行元素长度 44 = 16
a[0]+1:偏移一个单位,取a[0][1]
*(a[0]+1):相当于p[1]
a+1:a[1]地址的长度
*(a + 1):a[1]的数值 16
&a[0] + 1:指向a[1][0]的指针
*(&a[0] + 1):a[1][0]的数值
*a:以a[0]为首的一维数组
a[3]:以a[3][0]为首的一维数组