首先做这些练习前我们要明白 数组名的意义:
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表示首元素地址。而地址的大小都是4(32为平台)/8(64位平台)个字节。
ps:本篇为32位平台下运行结果
一维数组:
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)); //16
属于第1种情况,表示整个数组的大小,为16个字节
printf("%d\n",sizeof(a+0)); //4
表示首元素地址,大小为4个字节
printf("%d\n",sizeof(*a)); //4
首元素地址解引用,表示首元素,大小为4个字节
printf("%d\n",sizeof(a+1)); //4
表示首元素地址+1,即第二个元素地址,大小为4个字节
printf("%d\n",sizeof(a[1])); //4
表示第二个元素,大小为4个字节
printf("%d\n",sizeof(&a)); //4
表示整个数组的地址,大小为4个字节
printf("%d\n",sizeof(*&a)); //16
对数组的地址解引用,表示整个数组的大小,为16个字节
printf("%d\n",sizeof(&a+1)); //4
表示跳过整个数组的下一个数组的地址,大小为4个字节
printf("%d\n",sizeof(&a[0])); //4
表示首元素地址,大小为4个字节
printf("%d\n",sizeof(&a[0]+1)); //4
表示首元素地址+1,即第二个元素地址,大小为4个字节
字符数组
char arr[] = {'a','b','c','d','e','f'}; (没有 \0字符)
printf("%d\n", sizeof(arr)); //6
表示6个字节,有6个元素
printf("%d\n", sizeof(arr+0)); //4
表示首元素地址,大小为4个字节
printf("%d\n", sizeof(*arr)); //1
首元素地址解引用,表示首元素,大小为1个字节
printf("%d\n", sizeof(arr[1])); //1
表示第二个元素,大小为1个字节
printf("%d\n", sizeof(&arr)); //4
表示取数组的地址,大小为4个字节
printf("%d\n", sizeof(&arr+1)); //4
表示跳过一个数组下一个数组的地址,大小为4个字节
printf("%d\n", sizeof(&arr[0]+1)); //4
表示第二个元素的地址,大小为4个字节
printf("%d\n", strlen(arr)); //随机值x
strlen求字符串长度,传的是地址,遇到\0的位置不确定,arr表示首元素地址
printf("%d\n", strlen(arr+0)); //随机值x
遇到\0的位置不确定,arr表示首元素地址
printf("%d\n", strlen(*arr)); //错误
*arr是97作为地址传进去,97作为地址以后的空间不允许访问
printf("%d\n", strlen(arr[1])); //错误
同上
printf("%d\n", strlen(&arr)); //随机值x
遇到\0的位置不确定,arr表示首元素地址
printf("%d\n", strlen(&arr+1)); //随机值y x-y=6
跳过一个数组下一个数组的地址
printf("%d\n", strlen(&arr[0]+1)); //随机值 w x-w=1
从第二个元素向后数, 遇到\0的位置不确定
char arr[] = "abcdef"; (有\0字符)
printf("%d\n", sizeof(arr)); //7
表示数组的大小,7个字节
printf("%d\n", sizeof(arr+0)); //4
arr是首元素地址,大小为4个字节
printf("%d\n", sizeof(*arr)); //1
表示首元素,大小为1个字节
printf("%d\n", sizeof(arr[1])); //1
表示第二个元素,大小为1个字节
printf("%d\n", sizeof(&arr)); //4
表示数组的地址,大小为4个字节
printf("%d\n", sizeof(&arr+1)); //4
表示跳过一个数组到下一个数组的地址,大小为4个字节
printf("%d\n", sizeof(&arr[0]+1)); //4
表示第二个元素的地址,大小为4个字节
printf("%d\n", strlen(arr)); //6
表示字符串长度,大小为6
printf("%d\n", strlen(arr+0)); //6
表示字符串长度,大小为6个
printf("%d\n", strlen(*arr)); //错误
*arr是97作为地址传进去,97作为地址以后的空间不允许访问
printf("%d\n", strlen(arr[1])); //错误
同上
printf("%d\n", strlen(&arr)); //6
数组的地址和首元素地址值一样,从第一个元素开始数,大小为6
printf("%d\n", strlen(&arr+1)); //随机值
表示跳过一个数组下一个数组的地址,遇到\0的位置不确定
printf("%d\n", strlen(&arr[0]+1)); //5
从第二个元素开始数,大小为5
char *p = "abcdef"; //将常量字符串的a放到指针变量p中
printf("%d\n", sizeof(p)); //4
指针变量的大小,为4个字节
printf("%d\n", sizeof(p+1)); //4
b的地址的大小,为4个字节
printf("%d\n", sizeof(*p)); //1
首元素a字符的大小,为1个字节
printf("%d\n", sizeof(p[0])); //4
p[0] == *(p+0) 大小为1个字节
printf("%d\n", sizeof(&p)); //4
指针变量的地址,大小为4个字节
printf("%d\n", sizeof(&p+1)); //4
还是地址,大小为4个字节(跳过一个char*(指针类型))
printf("%d\n", sizeof(&p[0]+1)); //4
第二个元素地址,大小为4
printf("%d\n", strlen(p)); //6
p存放a的地址,往后数大小为6
printf("%d\n", strlen(p+1)); //5
p+1存放b的地址,往后数大小为5
printf("%d\n", strlen(*p)); //错误
*p是97作为地址传进去,97作为地址以后的空间不允许访问
printf("%d\n", strlen(p[0])); //错误
p[0]相当于*p
printf("%d\n", strlen(&p)); //随机值
遇到\0的位置不确定
printf("%d\n", strlen(&p+1)); //随机值
遇到\0的位置不确定
printf("%d\n", strlen(&p[0]+1)); //5
b的地址往后数,大小为5
二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a)); \\48
表整个数组的大小,为48个字节
printf("%d\n",sizeof(a[0][0])); \\4
表示第一行第一列的元素的大小,为4个字节
printf("%d\n",sizeof(a[0])); \\16
第一行数组名单独放在sizeof内部,表示第一行元素的大小,为16个字节
printf("%d\n",sizeof(a[0]+1)); \\4
第一行第一个元素地址加1为 第一行第二个元素的地址,大小为四个字节
printf("%d\n",sizeof(*(a[0]+1))); \\4
第一行第二个元素大小,为4个字节
printf("%d\n",sizeof(a+1)); \\4
首元素(第一行)地址加1 为第二行的地址,大小为4
printf("%d\n",sizeof(*(a+1))); \\16
第二行元素的大小,为16个字节
printf("%d\n",sizeof(&a[0]+1)); \\4
第一行的数组名取地址是第一行的地址 加1是第二行的地址,大小为4个字节
printf("%d\n",sizeof(*(&a[0]+1))); \\16
第二行元素大小,为16个字节
printf("%d\n",sizeof(*a)); \\16
第一行的大小,为16个字节 *(a+0)== a[0]
printf("%d\n",sizeof(a[3])); \\16
sizeof内部表达式不参与运算,算的是一行的元素的大小,不存在越界。大小为16个字节。