前言:
在学习完初级和进级的指针之后,为了检验掌握程度,这里出一期指针和数组的笔试题,看看你掌握的怎么样吧!
目录
Part1:数组笔试题
1.做题
1.1一维数组
1.2字符数组
1.3二维数组
2.总结
Part1:数组笔试题
1.做题
1.1一维数组
计算大小:
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)); printf("%d\n",sizeof(&a+1)); printf("%d\n",sizeof(&a[0])); printf("%d\n",sizeof(&a[0]+1));
这里可以暂停,自己做一下。
答案及解析:
int a[] = {1,2,3,4}; printf("%d\n",sizeof(a)); 16 -- 整个数组的大小 4*4 == 16 printf("%d\n",sizeof(a+0)); 8 -- + 0这个动作表明是指针 64位下指针大小固定为 8 printf("%d\n",sizeof(*a)); 4 -- 首元素地址解引用得到首元素1,一个整型大小为4 printf("%d\n",sizeof(a+1)); 8 -- 指针大小 printf("%d\n",sizeof(a[1])); 4 -- 元素2的大小 printf("%d\n",sizeof(&a)); 8 -- &a代表指向数组a的指针 printf("%d\n",sizeof(*&a)); 16 -- 承上,解引用后表示整个数组 printf("%d\n",sizeof(&a+1)); 8 -- 指针+1,表示步长,即指针大小 printf("%d\n",sizeof(&a[0])); 8 -- 首元素地址,指针大小 printf("%d\n",sizeof(&a[0]+1)); 8 -- 步长,即指针大小
1.2字符数组
计算大小:
第一部分
char arr[] = { 'a','b','c','d','e','f' }; // 没有\0 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' }; // 没有\0 printf("%d\n", sizeof(arr)); 6 -- 所有字符的总大小,一个字符一字节,共6字节 printf("%d\n", sizeof(arr + 0)); 8 -- 表示指针,8字节 printf("%d\n", sizeof(*arr)); 1 -- 首元素地址解引用得到首元素,大小为1 printf("%d\n", sizeof(arr[1])); 1 -- 元素b的大小 printf("%d\n", sizeof(&arr)); 8 -- 指向整个数组的指针大小 printf("%d\n", sizeof(&arr + 1)); 8 -- 指针步长 printf("%d\n", sizeof(&arr[0] + 1)); 8 -- 指向首元素指针的步长
第二部分
char arr[] = { 'a','b','c','d','e','f' }; // 没有\0 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' }; // 没有\0 printf("%d\n", strlen(arr)); 随机值 -- arr表示首元素地址,但不知道\0在哪,不知道停止 printf("%d\n", strlen(arr + 0)); 随机值 -- 同上,表示地址 printf("%d\n", strlen(*arr)); 报错 -- ==strlen('a'),非法访问 printf("%d\n", strlen(arr[1])); 报错 -- ==strlen('b'),非法访问 printf("%d\n", strlen(&arr)); 随机值 -- 从整个数组开始,向后寻找\0停止 printf("%d\n", strlen(&arr + 1)); 随机值 -- 从跳过整个数组开始,向后寻找\0停止 printf("%d\n", strlen(&arr[0] + 1)); 随机值 -- 从'b'的地址开始,向后寻找\0停止
第三部分
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));
答案及解析:
char arr[] = "abcdef"; // 末尾有\0 printf("%d\n", sizeof(arr)); 7 -- 包含\0在内 printf("%d\n", sizeof(arr+0)); 8 -- 指针大小 printf("%d\n", sizeof(*arr)); 1 -- a的大小 printf("%d\n", sizeof(arr[1])); 1 -- b的大小 printf("%d\n", sizeof(&arr)); 8 -- 字符串指针的大小 printf("%d\n", sizeof(&arr+1)); 8 -- 字符串指针的步长大小 printf("%d\n", sizeof(&arr[0]+1)); 8 -- 首元素指针的步长大小
第四部分
char arr[] = "abcdef"; // 末尾有\0 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[] = "abcdef"; // 末尾有\0 printf("%d\n", strlen(arr)); 6 -- 计算\0之前的大小 printf("%d\n", strlen(arr+0)); 6 -- 同上 printf("%d\n", strlen(*arr)); 报错 -- 给strlen传递'a' printf("%d\n", strlen(arr[1])); 报错 -- 给strlen传递'b' printf("%d\n", strlen(&arr)); 6 -- 取出起始位置的地址 printf("%d\n", strlen(&arr+1)); 随机值 -- 跳过整个数组(包含\0) printf("%d\n", strlen(&arr[0]+1)); 5 -- 从b开机计算大小,到\0之前
第五部分
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));
答案及解析:
char *p = "abcdef"; printf("%d\n", sizeof(p)); 8 -- p是指针变量,即指针大小 printf("%d\n", sizeof(p+1)); 8 -- p+1是指针变量 printf("%d\n", sizeof(*p)); 1 -- 即a的大小 printf("%d\n", sizeof(p[0])); 1 -- 即a的大小 printf("%d\n", sizeof(&p)); 8 -- 二级指针大小 printf("%d\n", sizeof(&p+1)); 8 -- 指向整个字符串的指针步长 printf("%d\n", sizeof(&p[0]+1)); 8 -- 指向b的指针的大小
第六部分
char *p = "abcdef"; printf("%d\n", sizeof(p)); 8 -- p是指针变量,即指针大小 printf("%d\n", sizeof(p+1)); 8 -- p+1是指针变量 printf("%d\n", sizeof(*p)); 1 -- 即a的大小 printf("%d\n", sizeof(p[0])); 1 -- 即a的大小 printf("%d\n", sizeof(&p)); 8 -- 二级指针大小 printf("%d\n", sizeof(&p+1)); 8 -- 指向整个字符串的指针步长 printf("%d\n", sizeof(&p[0]+1)); 8 -- 指向b的指针的大小
答案及解析:
char* p = "abcdef"; printf("%d\n", strlen(p)); 6 -- 标准求字符串长度 printf("%d\n", strlen(p + 1)); 5 -- 从b开始求字符串长度 printf("%d\n", strlen(*p)); 报错 -- strlen(a) printf("%d\n", strlen(p[0])); 报错 -- 同上 printf("%d\n", strlen(&p)); 随机值 -- 指向p的指针,另起 printf("%d\n", strlen(&p + 1)); 随机值 -- 跳过指向p的指针 printf("%d\n", strlen(&p[0] + 1)); 5 -- 从b开始求字符串长度
1.3二维数组
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[0]+1))); printf("%d\n",sizeof(a+1)); printf("%d\n",sizeof(*(a+1))); printf("%d\n",sizeof(&a[0]+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)); 48 -- 整个二位数组的大小 3*4*4 printf("%d\n",sizeof(a[0][0])); 4 -- 下标为0,0,即第一个元素的大小 printf("%d\n",sizeof(a[0])); 16 -- a[0]作为第一行的数组名,单独放在sizeof内部,计算的是数组第一行的大小 printf("%d\n",sizeof(a[0]+1)); 8 --a[0]作为第一行的数组名,没有单独放在sizeof内部,没有取地址,表示的就是数组首元素的地址,即a[0][0]的地址,再+1就是a[0][1]的地址,是地址就是指针,指针大小 printf("%d\n",sizeof(*(a[0]+1))); 4 -- 第一行第二个元素的大小 printf("%d\n",sizeof(a+1)); 8 -- a是二维数组的数组名,数组名表示首元素的地址,就是第一行的地址,a+1就是第二行的地址,是地址就是指针,指针大小 printf("%d\n",sizeof(*(a+1))); 16 -- 第二行的大小 printf("%d\n",sizeof(&a[0]+1)); 8 -- &a[0]是第一行的地址,&a[0]+1就是第二行的地址,地址的大小指针大小 printf("%d\n",sizeof(*(&a[0]+1))); 16 -- 第二行的大小 printf("%d\n",sizeof(*a)); 16 -- a表示首元素的地址,就是第一行的地址,*a就是第一行,计算的就是第一行的大小 printf("%d\n",sizeof(a[3])); 16 -- 如果数组存在第四行,a[3]就是第四行的数组名,数组名单独放在sizeof内部,计算的是第四行的大小
2.总结
数组名的意义:
• sizeof( 数组名 ) ,这里的数组名表示整个数组,计算的是整个数组的大小;
• &数组名,这里的数组名表示整个数组,取出的是整个数组的地址;
• 除此之外所有的数组名都表示首元素的地址。
总结:
这篇博客带大家做了些关于数组和指针的笔试题,基本上汇总了全部类型,其实到这里还没完,那么下篇再带大家继续指针的练习。
码文不易
如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦 💗💗💗