一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));
解释
字符数组
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
解释
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
这其中有的包含错误 不能编译运行 所以一个个解析
char arr[] = {'a','b','c','d','e','f'};
1 printf("%d\n", strlen(arr));
2 printf("%d\n", strlen(arr+0));
与上图(1)一样 括号中的arr与arr+0 都表示从第一个元素找起 直到\0结束。同一个系统下产生的随机值也与一样。
3printf("%d\n", strlen(*arr));
4printf("%d\n", strlen(arr[1]));
和3 一个道理 会把b的ASCII值98給strlen然后去寻找 报错 类型不兼容 道理和1.2一样。产生的结果也会和1.2一样
5printf("%d\n", strlen(&arr));
与1 2 一样
6printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
与1 2 一样 但会比1 2 大小减一 因为在第二个元素开始寻找
字符串:
char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));
解释
char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
与第一个道理一样 p+1表示第二个元素b的地址大小 4
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
与第三个一样 首元素a的大小 1
printf("%d\n", sizeof(&p));
与&arr一个道理 求得的是整个数组的地址大小4
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));
求的是第二个元素的地址大小4
printf("%d\n", strlen(p));
从首元素开始计算字符个数 直到\0结束 (\0不计算在内)
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
错误的 把a的ASCII码给了函数 去当作地址寻找
printf("%d\n", strlen(p[0]));
同上
printf("%d\n", strlen(&p));
把指针的地址給strlen去寻找 类似下图
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));
从第二个元素开始找 得到5
二维数组:
int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));
解释
int a[3][4] = {0};
printf("%d\n",sizeof(a));
a表示整个数组12个元素 大小为 12*4=48
printf("%d\n",sizeof(a[0][0]));
第一行第一列这个元素的大小 4
printf("%d\n",sizeof(a[0]));
a[0]表示第行四个元素 4*4=16
printf("%d\n",sizeof(a[0]+1));
a[0]表示第一行 +1 第一行第二个元素 大小为4
printf("%d\n",sizeof(a+1));
第二行元素的地址 大小为4
printf("%d\n",sizeof(&a[0]+1));
第一行 第二个元素的地址 4
printf("%d\n",sizeof(*a));
表示第一行元素 4*=16 (跟一维数组不同)
printf("%d\n",sizeof(a[3]));
已经跳出数组但地址空间依旧是4个 大小为4*4=16