Lei宝啊 :个人主页
愿所有美好不期而遇
前言:
数组名在寻常情况下表示首元素地址,但有两种情况例外:
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
3.sizeof是操作符,不是函数,并且sizeof不计算括号里的表达式,他会在编译阶段检查括号里的表达式的类型属性,计算出大小。(任何表达式都有两种属性,值属性和类型属性,
int a = 3; short b = 2; b = a + b;这个表达式的值属性就是5,类型属性就是short)
第二组笔试题
char arr[] = "abcdef"; 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));
答案
7 8 1 1 8 8 8
6 6 error error 6 随机值 5
(博主用的是64位机器,所以地址占的空间大小为8字节,如果得4的话,是32位机器)
解析
char arr[] = "abcdef"; printf("%d\n", sizeof(arr)); //sizeof(数组名),计算整个数组的大小, //字符串结尾还有\0占一个字节的空间,共7个字节 printf("%d\n", sizeof(arr + 0)); //类比arr+1,这里的arr代表数组首元素地址,所以4/8 printf("%d\n", sizeof(*arr)); //*arr访问的是char类型的数据,1个字节 printf("%d\n", sizeof(arr[1])); //第二个元素,数据类型为char,1个字节 printf("%d\n", sizeof(&arr)); //&arr,指针类型为数组指针,此时取出的是整个数组的地址, //但归根结底还是指针,占4/8个字节 printf("%d\n", sizeof(&arr + 1)); //数组指针向后走一个指针的距离,4/8 printf("%d\n", sizeof(&arr[0] + 1)); //指向第二个元素,4/8 //------------------------------------------------------------------- //------------------------------------------------------------------- //strlen是计算字符串长度的哦 printf("%d\n", strlen(arr)); //strlen遇到\0停止,所以得6 printf("%d\n", strlen(arr + 0)); //相同道理,6 printf("%d\n", strlen(*arr)); //error, *arr是'a',ASCII值为97,当做地址传入strlen, //成为野指针非法访问 printf("%d\n", strlen(arr[1])); //error, 'b'也同理 printf("%d\n", strlen(&arr)); //&arr与arr地址相同,尽管其意义不同, //&arr指针类型为数组指针,会被转换成strlen接受的指针类型, //所以我们最终得到的还是6 printf("%d\n", strlen(&arr + 1)); //随机值,&arr+1跳过的是整个数组,所以我们无法判断何时会 //再遇见\0,。 printf("%d\n", strlen(&arr[0] + 1)); //指向第二个元素,所以得到5