个人主页:Lei宝啊
愿所有美好如期而遇
前言:
数组名在寻常情况下表示首元素地址,但有两种情况例外:
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
3.sizeof是操作符,不是函数,并且sizeof不计算括号里的表达式,他会在编译阶段检查括号里的表达式的类型属性,计算出大小。(任何表达式都有两种属性,值属性和类型属性,
int a = 3; short b = 2; b = a + b;这个表达式的值属性就是5,类型属性就是short)
前言很重要,记住哦~
第一组笔试题
int main() { 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)); 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)); return 0; }
先自己做再看答案和解析哦~
答案
6 随机值
8 随机值
1 error
1 error
8 随机值
8 随机值
8 随机值
(博主用的是64位机器,所以地址占的空间大小为8字节)
解析
int main() { char arr[] = { 'a','b','c','d','e','f' }; printf("%d\n", sizeof(arr)); //sizeof里只有数组名,所以计算的是整个数组的大小 printf("%d\n", sizeof(arr + 0)); //此时数组名的意义是首元素的地址,类比arr+1,所以大小为4/8 printf("%d\n", sizeof(*arr)); //*arr访问的是char类型的数据,大小为1个字节 printf("%d\n", sizeof(arr[1])); //第一个元素,一个字节 printf("%d\n", sizeof(&arr)); //&arr,指针类型为char (*)[6],数组指针是指针,4/8 printf("%d\n", sizeof(&arr + 1)); //数组指针向后走一个指针的距离,还是指针 //而且sizeof并不做计算,只做类型检查 printf("%d\n", sizeof(&arr[0] + 1)); //第二个元素的地址,4/8 //------------------------------------------------------------------------------- //------------------------------------------------------------------------------- printf("%d\n", strlen(arr)); //strlen遇到\0才会停止,而数组末尾没有\0,所以是随机值 //因为我们也不知道什么时候才会碰到\0 printf("%d\n", strlen(arr + 0)); //仍然是随机值 printf("%d\n", strlen(*arr)); //*arr是第一个元素,'a',他的ASCII码值为97,也就是说, //我们传过去的97将会被当做是地址,但这个地址不是我们的 //是个野指针,所以会导致非法访问,error printf("%d\n", strlen(arr[1])); //同'a'一个道理,error printf("%d\n", strlen(&arr)); //&arr,指针类型为数组指针,但是strlen接受的指针类型为 //const char*,我们要传的数组指针将会被转换成const char*类型 //同时,&arr与arr的地址是相同的,尽管他们所代表的意义和类型不同 //所以是随机值 printf("%d\n", strlen(&arr + 1)); //同上,随机值 printf("%d\n", strlen(&arr[0] + 1)); //指向第二个元素,随机值 return 0; }