【这些题我一拿到手就会】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️⃣
在这里插入图片描述

🔑解析: 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));//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️⃣

在这里插入图片描述
🔑解析: 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));//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
在这里插入图片描述

首先,我们要清楚
在这里插入图片描述

🔑解析: 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));//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️⃣ 在这里插入图片描述
🔑解析: 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));//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️⃣
在这里插入图片描述 🔑解析: 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));//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️⃣ 在这里插入图片描述
🔑解析: 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为指针,则为 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

在这里插入图片描述

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

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

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

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

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


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

✒️ 笔者:陈汉新

📅 更新: 2022.3.14

❌ 勘误: 1.1解析4答案是4(已改正,由莫离626提出)

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

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

大佬友链:安然无虞🍎


  • 146
    点赞
  • 147
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 116
    评论
评论 116
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大猩猩!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值