> 文档中心 > 【这些题我一拿到手就会】C指针和数组试题详解(上)

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

文章目录

  • 前言
  • 一、数组专项训练
    • 1.一维数组
      • 1.1.整型数组
      • 1.2.字符数组
    • 2.二维数组
  • 二、指针专项训练

前言

  首先感谢各位的支持!让我感受到第一次上热榜的开心,朦胧的睡意瞬间被清洗一空。现在立马着手,快马加鞭出关于数组和指针专项训练😁。
  好喽!回到正题,上一章我们已经把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));// 162. printf("%d\n", sizeof(a + 0));// 4or83. printf("%d\n", sizeof(*a));// 44. printf("%d\n", sizeof(a + 1));// 4or85. printf("%d\n", sizeof(a[1]));// 46. printf("%d\n", sizeof(&a));// 4or87. printf("%d\n", sizeof(*&a));// 168. printf("%d\n", sizeof(&a + 1));// 4or89. printf("%d\n", sizeof(&a[0]));// 4or8   10. printf("%d\n", sizeof(&a[0] + 1));// 4

🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑解析如下:🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑

🔑解析: 1️⃣
在这里插入图片描述

🔑解析: 2️⃣
在这里插入图片描述
🔑解析: 3️⃣
在这里插入图片描述
🔑解析: 4️⃣
在这里插入图片描述
🔑解析: 5️⃣
在这里插入图片描述
🔑解析: 6️⃣
在这里插入图片描述

🔑解析: 7️⃣
在这里插入图片描述

🔑解析: 8️⃣
在这里插入图片描述
🔑解析: 9️⃣
在这里插入图片描述
🔑解析: 🔟
在这里插入图片描述

这图解简直就是蜘蛛侠配色吖~莫名地感觉还挺好看的呢!🤣

(附一个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
在这里插入图片描述

💯答案:

   char arr[] = { 'a','b','c','d','e','f' };   1. printf("%d\n", sizeof(arr));//62. printf("%d\n", sizeof(arr + 0));//4or83. printf("%d\n", sizeof(*arr));//14. printf("%d\n", sizeof(arr[1]));//15. printf("%d\n", sizeof(&arr));//4or86. printf("%d\n", sizeof(&arr + 1));//4or87. printf("%d\n", sizeof(&arr[0] + 1));//4or8

🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑解析如下:🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑

🔑解析: 1️⃣

在这里插入图片描述
🔑解析: 2️⃣ 在这里插入图片描述

🔑解析: 3️⃣ 在这里插入图片描述

🔑解析: 4️⃣ 在这里插入图片描述
🔑解析: 5️⃣ 在这里插入图片描述
🔑解析: 6️⃣ 在这里插入图片描述

🔑解析: 7️⃣ 在这里插入图片描述


💬 字符数组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));//72. printf("%d\n", sizeof(arr + 0));//4or83. printf("%d\n", sizeof(*arr));//14. printf("%d\n", sizeof(arr[1]));//15. printf("%d\n", sizeof(&arr));//4or86. printf("%d\n", sizeof(&arr + 1));//4or87. printf("%d\n", sizeof(&arr[0] + 1));//4or8

🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑解析如下:🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑

📚 首先,我们要区分如下两种字符数组形式:
arr1🆚 arr2
在这里插入图片描述

首先,我们要清楚
【这些题我一拿到手就会】C指针和数组试题详解(上)

🔑解析: 1️⃣
在这里插入图片描述

🔑解析: 2️⃣ 在这里插入图片描述

🔑解析: 3️⃣ 在这里插入图片描述

🔑解析: 4️⃣ 在这里插入图片描述

🔑解析: 5️⃣ 在这里插入图片描述

🔑解析: 6️⃣ 在这里插入图片描述

🔑解析: 7️⃣ 在这里插入图片描述


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));//error4. printf("%d\n", strlen(arr[1]));//error5. printf("%d\n", strlen(&arr));//随机值6. printf("%d\n", strlen(&arr + 1));//随机值7. printf("%d\n", strlen(&arr[0] + 1));//随机值

🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑解析如下:🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑

📚老生常谈的数组名相关:

数组名代表整个数组:
①sizeof(数组名):仅数组名单独放在( )
②&数组名
除了这两种情况,数组名都是数组首元素的地址。

🔑解析: 1️⃣ 在这里插入图片描述
🔑解析: 2️⃣ 在这里插入图片描述

🔑解析: 3️⃣ 在这里插入图片描述
🔑解析: 4️⃣
在这里插入图片描述
🔑解析: 5️⃣ 在这里插入图片描述
🔑解析: 6️⃣ 在这里插入图片描述
🔑解析: 7️⃣ 在这里插入图片描述


💬:字符数组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));//62. printf("%d\n", strlen(arr + 0));//63. printf("%d\n", strlen(*arr));//error4. printf("%d\n", strlen(arr[1]));//error5. printf("%d\n", strlen(&arr));//76. printf("%d\n", strlen(&arr + 1));//随机值7. printf("%d\n", strlen(&arr[0] + 1));//5

🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑解析如下:🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑

🔑解析: 1️⃣
在这里插入图片描述 🔑解析: 2️⃣在这里插入图片描述

🔑解析: 3️⃣
在这里插入图片描述

🔑解析: 4️⃣
在这里插入图片描述

🔑解析: 5️⃣

在这里插入图片描述

🔑解析: 6️⃣
在这里插入图片描述

🔑解析: 7️⃣
在这里插入图片描述

大中午的,顶不住了,我先补个午觉。对不住了,汤老师😶
在这里插入图片描述


2.二维数组

2.1.整型二维数组与sizeof()操作符

📚 首先,明确二维数组在内存的存储形式:
👉传送门: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));//482. printf("%d\n", sizeof(a[0][0]));//43. printf("%d\n", sizeof(a[0]));//164. printf("%d\n", sizeof(a[0] + 1));//4or85. printf("%d\n", sizeof(*(a[0] + 1)));//46. printf("%d\n", sizeof(a + 1));//4or87. printf("%d\n", sizeof(*(a + 1)));//168. printf("%d\n", sizeof(&a[0] + 1));//4or89. printf("%d\n", sizeof(*(&a[0] + 1)));//16   10. printf("%d\n", sizeof(*a));//16

🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑解析如下:🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑

🔑解析: 1️⃣ 在这里插入图片描述
🔑解析: 2️⃣ 在这里插入图片描述

🔑解析: 3️⃣ 在这里插入图片描述

🔑解析: 4️⃣ 在这里插入图片描述

🔑解析: 5️⃣ 在这里插入图片描述

🔑解析: 6️⃣ 在这里插入图片描述

🔑解析: 7️⃣ 在这里插入图片描述
🔑解析: 8️⃣ 在这里插入图片描述
🔑解析: 9️⃣ 在这里插入图片描述

🔑解析: 🔟 在这里插入图片描述

🔑解析: 1️⃣1️⃣ 在这里插入图片描述

为了写博客不容易吖~现在正在教室后排疯狂闪躲,疯狂输出。(含泪要三连😂)


上面的方式比较耗时间,下面的训练比较简单顺便偷个懒😅

二、指针专项训练

📚回顾:
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为指针,则为 4or8printf("%d\n", sizeof(p + 1));//p + 1仍是指针,则为4/8printf("%d\n", sizeof(*p));//对指针解引用找到a,类型为char,则为1printf("%d\n", sizeof(p[0]));//p[0]*(p+0),同上为1printf("%d\n", sizeof(&p));//&p:取指针p的地址,二级指针也是指针,则为4/8printf("%d\n", sizeof(&p + 1));//&p + 1:指针 + 1,仍是指针,则为4/8printf("%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));//6printf("%d\n", strlen(p + 1));//5printf("%d\n", strlen(*p));//*p找到a(ASCII值97),errorprintf("%d\n", strlen(p[0]));//p[0]等价*(p+0),同上errorprintf("%d\n", strlen(&p));//取的是p的地址,\0位置未知,返回随机值printf("%d\n", strlen(&p + 1));//p的指针+1,\0位置未知,返回随机值printf("%d\n", strlen(&p[0] + 1));//'b'的地址,返回5

在这里插入图片描述

疑问: 图文解析的形式好还是注释的方式好呢?铁子们可以在评论区给点建议

感受: 春天来了,花开自有蝴蝶来,蜜蜂也外出采蜜了。笔者却用寻找良缘,沐浴春风的时间来为大家开启知识的大门。还望各位亲点个关注,为我们续上良缘。

制作不易,恳请各位铁汁点赞收藏评论加关注,你的支持是我坚持的动力~

(附:CSDN社区 《创作达人》活动,只要参与其中并创作文章就有机会获得官方奖品:精品日历、新程序员杂志,快来参与吧!链接直达https://bbs.csdn.net/topics/605272551)

补: 博主想拿个小礼品,请大家高抬贵手点个赞呗~
在这里插入图片描述


参考资料:
【C语言入门必看】数组
【C语言入门必看】指针
【详解C语言指针】

✒️ 笔者:陈汉新

📅 更新: 2022.3.14

❌ 勘误: 暂无

📣 声明:由于作者水平有限,本文错误之处在所难免,敬请读者指正!

  本人有幸得到大佬指导,在此说声感谢大佬!
大佬友链:柠檬叶子C🍋

大佬友链:安然无虞🍎