sizeof
上习题,不知道大家发现与上一张的习题在哪里不一样嘛?
int main()
{char arr[] = "abcdef";printf("%zd\n", sizeof(arr));printf("%zd\n", sizeof(arr + 0));printf("%zd\n", sizeof(*arr));printf("%zd\n", sizeof(arr[1]));printf("%zd\n", sizeof(&arr));printf("%zd\n", sizeof(&arr + 1));printf("%zd\n", sizeof(&arr[0] + 1));return 0;
}
对喽!
上一个是
char arr[]={'a','b','c','d','e'};
大家可以在计算一下,巩固知识点啦。
欧克,上答案
如下:
1. arr表示整个数,计算的是整个数组的大小单位字节,7*1 = 7
2. arr就是数组首元素的地址, arr+0还是数组首元素的地址 4 / 8(在不同环境下)
3. arr就是数组首元素的地址,*arr是首元素,大小就是1个字节
4. arr[1]数组的第二个元素,计算的就是第二个元素的大小,单位是字节 - 1
5.arr表示整个数组,&arr取出的是整个数组的地址,是地址大小就是 4 / 8个字节
6. &arr + 1是跳过这个数组后的地址,是地址大小就是 4 / 8个字节
7. &arr[0]是数组首元素的地址,&arr[0]+1是数组第二个元素的地址:4 / 8
strlen
习题与sizeof一样,在这里放一起更好的比较一下。
int main()
{
char arr[] = "abcdef";printf("%zd\n", strlen(arr));printf("%zd\n", strlen(arr + 0));printf("%zd\n", strlen(*arr));printf("%zd\n", strlen(arr[1]));printf("%zd\n", strlen(&arr));printf("%zd\n", strlen(&arr + 1));printf("%zd\n", strlen(&arr[0] + 1)); return 0;
}
答案公布:
1. 6: arr是数组首元素的地址,从第一个元素开始,统计\0之前字符的个数
2. 6:arr是数组首元素的地址,arr+0还是数组首元素的地址,结果同上
3.非法访问内存,导致程序崩溃
4.arr[1]是第二个元素 == 'b' == 98, 道理同上,非法访问内存,导致程序崩溃
5.6:&arr取出的是数组的地址,数组的地址和首元素的地址是同一个值
6. 随机值
7.5:&arr[0] + 1是第二个元素的地址,\0之前有5个元素