1 定义一个一维整型数组 int a[ ]={1,2,3,4}
printf("%d\n",sizeof(a)) 输出为16 //数组名单独放在sizeof内,求取的是整个数组的大小
printf("%d\n",sizeof(*a)) 4 //a代表首元素的地址,对a解引用,就是首元素的大小
printf("%d\n",sizeof(a+0)) 4 //a+0代表数组首元素,这里求的是首元素的大小
printf("%d\n",sizeof(a+1)) 4 //a+1代表数组的第二个元素
printf("%d\n",sizeof(a[1])) 4 //a[1]代表数组的第二个元素
printf("%d\n",sizeof(&a)) 4 //&a指整个数组的地址,一个地址的大小为4个字节
printf("%d\n",sizeof(&a+1)) 4 //&a+1指数组外面的地址,仍是4个字节
printf("%d\n",sizeof(&a[0])) 4 //&a[0]代表数组首元素的地址,为4个字节
printf("%d\n",sizeof(&a[0]+1)) 4 //&a[0]+1代表数组第二个元素的地址,为4个字节
printf("%d\n",sizeof(*&a)) 4 //&a指整个数组的地址,解引用之后求的是整个数组的大小
2 定义一个字符数组 char arr[ ]={a,b,c,d,e,f}
printf("%d\n",sizeof(arr)) 6 //求取整个数组的大小
printf("%d\n",sizeof(arr+0)) 4 //求取数组首元素的地址的大小
printf("%d\n",sizeof(*arr)) 1 //arr代表首元素的地址,*a指首元素a的大小
printf("%d\n",sizeof(arr[1])) 1 //arr[1]代表数组的第二个元素,它的大小为一个字节
printf("%d\n",sizeof(&arr)) 4 //&rr指整个数组的地址,其大小为4个字节
printf("%d\n",sizeof(&arr+1)) 4 //数组外面的地址,仍是4个字节
printf("%d\n",sizeof(&arr[0]+1)) 4 //数组第二个元素的地址,大小为4个字节
用strlen求取字符数组的大小
首先说明一点,strlen在求取字符串长度的时候遇到\0就停止统计
printf("%d\n",strlen(arr)) 随机值 //该字符数组没有\0,所以该数组的大小不能确定
printf("%d\n",strlen(arr+0)) 这个值和上面的值一样,因为它们都是从数组的首元素开始查找
printf("%d\n",strlen(*arr)) error //*arr代表字符'a',访问strlen('a')的方法是无效的
printf("%d\n",strlen(arr[1])) error //arr[1]代表字符'b',访问strlen('b')的方法是无效的
printf("%d\n",strlen(&arr)) 随机值
printf("%d\n",strlen(&arr+1)) 随机值 //&arr+1跳到数组外面,strlen从数组的外面开始统计字符的个数
printf("%d\n",strlen(&arr[0]+1)) 随机值 //strlen从数组的第二个元素开始统计字符的个数
3 定义一个字符指针数组 char *p="abcdef"
首先 char *p="abcdef"表示把字符a的地址存到指针变量p中
printf("%d\n",sizeof(p)) 4 //p是一个指针变量,大小为4个字节
printf("%d\n",sizeof(p+1)) 4 //(p+1)中存放的是字符b的地址,是用一个指针变量存放的,大小为4个字节
printf("%d\n",sizeof(*p)) 1 //*p表示字符a的大小,为1个字节
printf("%d\n",sizeof(p[0])) 1 //求的是数组首元素a的大小
printf("%d\n",sizeof(&p)) 4 //指整个数组的地址,其大小为4个字节
printf("%d\n",sizeof(&p+1)) 4 //数组外的一个地址的大小
printf("%d\n",sizeof(&p[0]+1)) 4 //数组第二个元素的地址的大小
用strlen求取字符数组的大小
printf("%d\n",strlen(p)) 6//f后面的字符是\0
printf("%d\n",strlen(p+1)) 5//从字符b开始统计
printf("%d\n",strlen(*p)) error//不能访问strlen('a')
printf("%d\n",strlen(p[0])) error//同上
printf("%d\n",strlen(&p)) 随机值//&p代表取字符a的地址的地址,不知道\0的位置
printf("%d\n",strlen(&p+1)) 随机值//同上
printf("%d\n",strlen(&p[0]+1)) 5//从字符b开始统计,遇到f后面的\0停止
4 定义一个二维数组 int a[3][4]={0}
printf("%d\n", sizeof(a)); //48 a表示整个数组,大小为12*4=48个字节
printf("%d\n", sizeof(a[0][0])); //4 a[0][0]表示数组第一个元素,大小为4个字节
printf("%d\n", sizeof(a[0])); //16 a[0]表示数组第一行元素,大小为4*4=16个字节
printf("%d\n", sizeof(a[0] + 1)); //4 a[0]表示a[0][0]的地址,a[0]+1表示a[0][1]的地址
printf("%d\n", sizeof(a + 1)); //4 a表示首元素的地址,a+1表示第二行第一个元素的地址
printf("%d\n", sizeof(&a[0] + 1)); //4 &a[0] + 1表示取第二行的地址
printf("%d\n", sizeof(*a)); //16 *a表示第一行的元素的大小,4*4=16个字节
printf("%d\n", sizeof(a[3])); //16 sizeof内部的表达式不参与运算,a[3]代表数组第四行的元素的大小,4*4=16个字节
在对数组进行运算时,对指针解引用,取决于指针的类型