C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)


文章目录

  • 前言
  • 一、数组专项训练
    • 1.一维数组
      • 1.1.整型数组
      • 1.2.字符数组
    • 2.二维数组
  • 二、指针专项训练
【C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)】
前言 ? 首先感谢各位的支持!让我感受到第一次上热榜的开心,朦胧的睡意瞬间被清洗一空。现在立马着手,快马加鞭出关于数组和指针专项训练。
? 好喽!回到正题,上一章我们已经把C指针按在地上摩擦了(相信大家已经没有了对C指针的恐惧)。什么?你还没看过,我们当年读大学不是这么读的 ,哈哈没看过的铁汁,可以点击详解C指针传送门,学习完后记得回来吖~

建议:尝试自己做一遍,再校对答案,如此食用,味道更佳~
一、数组专项训练
  • 老生常谈的数组名相关:
    数组名代表整个数组:
    ①sizeof(数组名):仅数组名单独放在( )
    ②&数组名
    除了这两种情况,数组名都是数组首元素的地址。
  • strlen() sizeof()
    • strlen(): C 库函数 size_t strlen(const char *str) 计算字符串 str的长度,直到空结束字符('\0'),但不包括空结束字符('\0')
    • sizeof(): 是一个操作符(运算符),sizeof是用来计算变量所占内存空间的大小,任何类型都可以使用,只关注空间大小,不会涉及到对这个空间的访问。
      总结一句就是 sizeof 计算的是变量的大小,而 strlen 计算的是字符串的长度,前者不受字符 \0 影响,后者以 \0 作为长度判定依据。
1.一维数组 1.1.整型数组
:整型数组
int a[] = { 1,2,3,4 }; 1. printf("%d\n", sizeof(a)); 2. printf("%d\n", sizeof(a + 0)); 3. printf("%d\n", sizeof(*a)); 4. printf("%d\n", sizeof(a + 1)); 5. printf("%d\n", sizeof(a[1])); 6. printf("%d\n", sizeof(&a)); 7. printf("%d\n", sizeof(*&a)); 8. printf("%d\n", sizeof(&a + 1)); 9. printf("%d\n", sizeof(&a[0])); 10. printf("%d\n", sizeof(&a[0] + 1));

答案:
int a[] = { 1,2,3,4 }; 1. printf("%d\n", sizeof(a)); // 16 2. printf("%d\n", sizeof(a + 0)); // 4or8 3. printf("%d\n", sizeof(*a)); // 4 4. printf("%d\n", sizeof(a + 1)); // 4or8 5. printf("%d\n", sizeof(a[1])); // 4 6. printf("%d\n", sizeof(&a)); // 4or8 7. printf("%d\n", sizeof(*&a)); // 16 8. printf("%d\n", sizeof(&a + 1)); // 4or8 9. printf("%d\n", sizeof(&a[0])); // 4or8 10. printf("%d\n", sizeof(&a[0] + 1)); // 4

解析如下:
解析: 1??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 2??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 3??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 4??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 5??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 6??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 7??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 8??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 9??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析:
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

这图解简直就是蜘蛛侠配色吖~莫名地感觉还挺好看的呢!
(附一个Spider-Man帅照??,甚至可以拿来做壁纸)

1.2.字符数组
1.2.1.字符数组与sizeof()操作符
:字符数组char arr[ ] = { 'a','b','c','d','e','f' }; sizeof()操作符
char arr[] = { 'a','b','c','d','e','f' }; 1. printf("%d\n", sizeof(arr)); 2. printf("%d\n", sizeof(arr + 0)); 3. printf("%d\n", sizeof(*arr)); 4. printf("%d\n", sizeof(arr[1])); 5. printf("%d\n", sizeof(&arr)); 6. printf("%d\n", sizeof(&arr + 1)); 7. printf("%d\n", sizeof(&arr[0] + 1));

首先,我们要区分如下两种数组形式:
arr1 arr2
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

答案:
char arr[] = { 'a','b','c','d','e','f' }; 1. printf("%d\n", sizeof(arr)); //6 2. printf("%d\n", sizeof(arr + 0)); //4or8 3. printf("%d\n", sizeof(*arr)); //1 4. printf("%d\n", sizeof(arr[1])); //1 5. printf("%d\n", sizeof(&arr)); //4or8 6. printf("%d\n", sizeof(&arr + 1)); //4or8 7. printf("%d\n", sizeof(&arr[0] + 1)); //4or8

解析如下:
解析: 1??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 2?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 3?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 4?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 5?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 6?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 7?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

字符数组char arr[ ]="abcdef"sizeof()操作符
char arr[] = "abcdef"; 1. printf("%d\n", sizeof(arr)); 2. printf("%d\n", sizeof(arr + 0)); 3. printf("%d\n", sizeof(*arr)); 4. printf("%d\n", sizeof(arr[1])); 5. printf("%d\n", sizeof(&arr)); 6. printf("%d\n", sizeof(&arr + 1)); 7. printf("%d\n", sizeof(&arr[0] + 1));

答案:
char arr[] = "abcdef"; 1. printf("%d\n", sizeof(arr)); //7 2. printf("%d\n", sizeof(arr + 0)); //4or8 3. printf("%d\n", sizeof(*arr)); //1 4. printf("%d\n", sizeof(arr[1])); //1 5. printf("%d\n", sizeof(&arr)); //4or8 6. printf("%d\n", sizeof(&arr + 1)); //4or8 7. printf("%d\n", sizeof(&arr[0] + 1)); //4or8

解析如下:
首先,我们要区分如下两种字符数组形式:
arr1 arr2
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

首先,我们要清楚
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 1??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 2?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 3?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 4?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 5?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 6?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 7?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

1.2.2.字符数组与strlen()函数
C 库函数 - strlen()
描述
C 库函数 size_t strlen(const char *str) 计算字符串 str的长度,直到空结束字符('\0'),但不包括空结束字符('\0')
声明
下面是 strlen() 函数的声明。
size_t strlen(const char*str) 参数 str – 要计算长度的字符串。
返回值
该函数返回字符串的长度。
:字符数组char arr[] = { 'a','b','c','d','e','f' }; strlen()函数
char arr[] = { 'a','b','c','d','e','f' }; 1. printf("%d\n", strlen(arr)); 2. printf("%d\n", strlen(arr + 0)); 3. printf("%d\n", strlen(*arr)); 4. printf("%d\n", strlen(arr[1])); 5. printf("%d\n", strlen(&arr)); 6. printf("%d\n", strlen(&arr + 1)); 7. printf("%d\n", strlen(&arr[0] + 1));

答案:
char arr[] = { 'a','b','c','d','e','f' }; 1. printf("%d\n", strlen(arr)); //随机值 2. printf("%d\n", strlen(arr + 0)); //随机值 3. printf("%d\n", strlen(*arr)); //error 4. printf("%d\n", strlen(arr[1])); //error 5. printf("%d\n", strlen(&arr)); //随机值 6. printf("%d\n", strlen(&arr + 1)); //随机值 7. printf("%d\n", strlen(&arr[0] + 1)); //随机值

解析如下:
老生常谈的数组名相关:
数组名代表整个数组:
①sizeof(数组名):仅数组名单独放在( )
②&数组名
除了这两种情况,数组名都是数组首元素的地址。
解析: 1?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 2?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 3?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 4??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 5?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 6?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 7?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

:字符数组char arr[ ]="abcdef"strlen()函数
char arr[] = "abcdef"; 1. printf("%d\n", strlen(arr)); 2. printf("%d\n", strlen(arr + 0)); 3. printf("%d\n", strlen(*arr)); 4. printf("%d\n", strlen(arr[1])); 5. printf("%d\n", strlen(&arr)); 6. printf("%d\n", strlen(&arr + 1)); 7. printf("%d\n", strlen(&arr[0] + 1));

答案:
char arr[] = "abcdef"; 1. printf("%d\n", strlen(arr)); //6 2. printf("%d\n", strlen(arr + 0)); //6 3. printf("%d\n", strlen(*arr)); //error 4. printf("%d\n", strlen(arr[1])); //error 5. printf("%d\n", strlen(&arr)); //7 6. printf("%d\n", strlen(&arr + 1)); //随机值 7. printf("%d\n", strlen(&arr[0] + 1)); //5

解析如下:
解析: 1??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片
解析: 2??C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 3??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 4??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 5??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 6??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 7??
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

大中午的,顶不住了,我先补个午觉。对不住了,汤老师
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

2.二维数组 2.1.整型二维数组与sizeof()操作符
首先,明确二维数组在内存的存储形式:
传送门:C基础数组知识C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

:整型二维数组与sizeof()操作符
int a[3][4] = { 0 }; 1. printf("%d\n", sizeof(a)); 2. printf("%d\n", sizeof(a[0][0])); 3. printf("%d\n", sizeof(a[0])); 4. printf("%d\n", sizeof(a[0] + 1)); 5. printf("%d\n", sizeof(*(a[0] + 1))); 6. printf("%d\n", sizeof(a + 1)); 7. printf("%d\n", sizeof(*(a + 1))); 8. printf("%d\n", sizeof(&a[0] + 1)); 9. printf("%d\n", sizeof(*(&a[0] + 1))); 10. printf("%d\n", sizeof(*a));

答案:
int a[3][4] = { 0 }; 1. printf("%d\n", sizeof(a)); //48 2. printf("%d\n", sizeof(a[0][0])); //4 3. printf("%d\n", sizeof(a[0])); //16 4. printf("%d\n", sizeof(a[0] + 1)); //4or8 5. printf("%d\n", sizeof(*(a[0] + 1))); //4 6. printf("%d\n", sizeof(a + 1)); //4or8 7. printf("%d\n", sizeof(*(a + 1))); //16 8. printf("%d\n", sizeof(&a[0] + 1)); //4or8 9. printf("%d\n", sizeof(*(&a[0] + 1))); //16 10. printf("%d\n", sizeof(*a)); //16

解析如下:
解析: 1?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 2?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 3?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 4?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 5?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 6?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 7?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 8?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 9?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

解析: 1??1?? C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

为了写博客不容易吖~现在正在教室后排疯狂闪躲,疯狂输出。(含泪要三连)
上面的方式比较耗时间,下面的训练比较简单顺便偷个懒
二、指针专项训练
回顾:
char* p = "abcdef"; p中存着首字符 'a' 的地址,且字符串在内存中连续存放,因此可以遍历整个串。
这些我们在C指针进阶篇已经学习了。详解C指针传送门
:字符指针与sizeof()操作符
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)); //p为指针,则为 4or8 printf("%d\n", sizeof(p + 1)); //p + 1仍是指针,则为4/8 printf("%d\n", sizeof(*p)); //对指针解引用找到a,类型为char,则为1 printf("%d\n", sizeof(p[0])); //p[0]<==>*(p+0),同上为1 printf("%d\n", sizeof(&p)); //&p:取指针p的地址,二级指针也是指针,则为4/8 printf("%d\n", sizeof(&p + 1)); //&p + 1:指针 + 1,仍是指针,则为4/8 printf("%d\n", sizeof(&p[0] + 1)); //&*(p+0)+1抵消完是p+1,仍是指针,则为4/8

:字符指针与strlen()函数
char* p = "abcdef"; printf("%d\n", strlen(p)); printf("%d\n", strlen(p + 1)); printf("%d\n", strlen(*p)); printf("%d\n", strlen(p[0])); printf("%d\n", strlen(&p)); printf("%d\n", strlen(&p + 1)); printf("%d\n", strlen(&p[0] + 1));

解答:
char* p = "abcdef"; printf("%d\n", strlen(p)); //6 printf("%d\n", strlen(p + 1)); //5 printf("%d\n", strlen(*p)); //*p找到a(ASCII值97),error printf("%d\n", strlen(p[0])); //p[0]等价*(p+0),同上error printf("%d\n", strlen(&p)); //取的是p的地址,\0位置未知,返回随机值 printf("%d\n", strlen(&p + 1)); //p的指针+1,\0位置未知,返回随机值 printf("%d\n", strlen(&p[0] + 1)); //'b'的地址,返回5

C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

疑问: 图文解析的形式好还是注释的方式好呢?铁子们可以在评论区给点建议
感受: 春天来了,花开自有蝴蝶来,蜜蜂也外出采蜜了。笔者却用寻找良缘,沐浴春风的时间来为大家开启知识的大门。还望各位亲点个关注,为我们续上良缘。
制作不易,恳请各位铁汁点赞收藏评论加关注,你的支持是我坚持的动力~
(附:CSDN社区 《创作达人》活动,只要参与其中并创作文章就有机会获得官方奖品:精品日历、新程序员杂志,快来参与吧!链接直达https://bbs.csdn.net/topics/605272551)
补: 博主想拿个小礼品,请大家高抬贵手点个赞呗~
C语言进阶|【这些题我一拿到手就会】C指针和数组试题详解(上)
文章图片

参考资料:
【C语言入门必看】数组
【C语言入门必看】指针
【详解C语言指针】
?? 笔者:陈汉新
更新: 2022.3.14
? 勘误: 1.1解析4答案是4(已改正,由莫离626提出)
声明:由于作者水平有限,本文错误之处在所难免,敬请读者指正!
? 本人有幸得到大佬指导,在此说声感谢大佬!
? 大佬友链:柠檬叶子C
? 大佬友链:安然无虞

    推荐阅读