和黛玉学编程呀----------
这节是练习题哦,不知道理论的可以看看我的指针解析一节噢,当然这节也会插一些之前的知识,避免不够清楚>>
数组和指针笔试题解析
一维数组
int main() { int a[] = { 1,2,3,4 }; printf("%zd\n", sizeof(a)); printf("%zd\n", sizeof(a + 0)); printf("%zd\n", sizeof(*a)); printf("%zd\n", sizeof(a + 1)); printf("%zd\n", sizeof(a[1])); printf("%zd\n", sizeof(&a)); printf("%zd\n", sizeof(*&a)); printf("%zd\n", sizeof(&a + 1)); printf("%zd\n", sizeof(&a[0])); printf("%zd\n", sizeof(&a[0] + 1)); return 0; }
我们再回顾一下,数组名一般是数组首元素的地址,但是除了sizeof+数组名(计算的是整个数组大小),和&数组名 (取出数组的地址)
printf("%zd\n", sizeof(a)); | 因为sizeof+数组名,计算的是整个数组的大小,一个int类型的数占4个字节,所以就是4*4=16 |
printf("%zd\n", sizeof(a + 0)); | a表示首元素地址,加0以后还是首元素地址,故计算的是首元素地址的大小,即4或者8,因为之前说过,地址的大小都只存在4或者8 |
printf("%zd\n", sizeof(*a)) | a表示首元素地址,*a表示解引用,就是这个地址存的东西,就是计算1的大小,为4 |
printf("%zd\n", sizeof(a + 1)); | a表示首元素地址,加1以后就是第二个元素,计算的是2的大小,为4 |
printf("%zd\n", sizeof(a[1])); | a[1]是第二个元素,即4 |
printf("%zd\n", sizeof(&a)); | &数组就是取出数组的地址,地址大小不是4就是8 |
printf("%zd\n", sizeof(*&a)); | 取地址又解引用,结果还是a,计算的是整个数组大小,为16 |
printf("%zd\n", sizeof(&a[0])); | 首元素的地址,即为4或8 |
printf("%zd\n", sizeof(&a[0] + 1)) | 取第一个元素地址,加一后是第二个元素的地址,即4或者8 |
显示详细信息
看答案:
这个是在X64环境下,所以地址大小为8
我们再看这个,因为是X86环境,所以地址大小为4,这也就是为什么上面我的答案是4或者8的原因
字符数组(sizeof、strlen)
char arr[] = { 'a','b','c','d','e','f' };
sizeof
#include <stdio.h> 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)); return 0; }
printf("%d\n", sizeof(arr)); | sizeof+数组名,表示整个数组大小,char类型的数组一个字符占1个字节,答案就是6*1=6 |
printf("%d\n", sizeof(arr + 0)); | arr表示首元素地址,加一还是首元素地址,答案为4或者8 |
printf("%d\n", sizeof(*arr)); | arr是首元素地址,*arr就是首元素,答案为1 |
printf("%d\n", sizeof(arr[1])); | arr[1]是第二个元素,即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 |
显示详细信息
X64环境下代码运行如下
strlen
我们这里需要知道strlen计算的是'\0'前面的元素大小,哪怕在一个数组里面没有\0,它也会继续访问直到找到\0为止
#include <stdio.h> int main() { char arr[] = { 'a','b','c','d','e','f' }; printf("%d\n", strlen(arr)); printf("%d\n", strlen(arr + 0)); 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; }
printf("%d\n", strlen(arr)); | 我们可以知道这个数组里面没有\0,所以这里是随机值 |
printf("%d\n", strlen(arr + 0)); | 随机值 |
printf("%d\n", strlen(arr[1])); | 程序崩溃,和下面这个情况一样 |
printf("%d\n", strlen(*arr)); | 这个代码会导致程序崩溃,因为正常来说,strlen接收是char *,是地址,这里传的是‘a’,对应ASCII码为‘97’,它把97当做一个地址,但是这个地址并没有给你 |
printf("%d\n", strlen(&arr + 1)); | 随机值 |
printf("%d\n", strlen(&arr[0] + 1)); |
随机值 |
显示详细信息
错误警告如下
char arr[] = "abcdef";
sizeof
#include <stdio.h> 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; }
printf("%zd\n", sizeof(arr)); | 字符串后面有一个隐藏的‘\0’,故为7 |
printf("%zd\n", sizeof(arr + 0)); | arr为首元素地址,整个数组大小加一还是首元素地址,为4或者8 |
printf("%zd\n", sizeof(*arr)); | arr为首元素地址,解引用为首元素,为1 |
printf("%zd\n", sizeof(arr[1])); | arr[1]为b,第二个元素,为1 |
printf("%zd\n", sizeof(&arr)) | &arr,取出整个数组地址,为4或者8 |
printf("%zd\n", sizeof(&arr + 1)); | 取出整个数组的地址加一跳到下一个数组地址,为4或者8 |
printf("%zd\n", sizeof(&arr[0] + 1)); | 第二个元素地址,为4或者8 |
strlen
#include <stdio.h> 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; }
printf("%zd\n", strlen(arr)); | arr为首元素地址开始,\0前面字符个数,即为6 |
printf("%zd\n", strlen(arr + 0)); | 首元素大小开始,到\0,为6 |
printf("%zd\n", strlen(*arr)); | 首元素为a,程序崩溃,和上面的一样 |
printf("%zd\n", strlen(arr[1])); | 元素b,程序崩溃 |
printf("%zd\n", strlen(&arr)); | &arr是数组的地址,但是也是从首元素地址指起,为6 |
printf("%zd\n", strlen(&arr + 1)); | &arr取整个数组大小,加一是下一个数组,我们不知道跳过这个数组是什么样的,故为随机值 |
printf("%zd\n", strlen(&arr[0] + 1)); | 首元素地址为第二个元素地址,从这里开始为5 |
后续会更新指针笔试题解析噢,非常感谢您的阅读,希望你可以学到知识呀