【这些题我一拿到手就会】C指针和数组试题详解(上)
文章目录
- 前言
- 一、数组专项训练
-
- 1.一维数组
-
- 1.1.整型数组
- 1.2.字符数组
- 2.二维数组
- 二、指针专项训练
前言
首先感谢各位的支持!让我感受到第一次上热榜的开心,朦胧的睡意瞬间被清洗一空。现在立马着手,快马加鞭出关于数组和指针专项训练😁。
好喽!回到正题,上一章我们已经把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
首先,我们要清楚
🔑解析: 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🍋
大佬友链:安然无虞🍎