文章目录
- 前言
- 一、数组专项训练
-
- 1.一维数组
-
- 1.1.整型数组
- 1.2.字符数组
- 2.二维数组
- 二、指针专项训练
前言 ? 首先感谢各位的支持!让我感受到第一次上热榜的开心,朦胧的睡意瞬间被清洗一空。现在立马着手,快马加鞭出关于数组和指针专项训练。
? 好喽!回到正题,上一章我们已经把C指针按在地上摩擦了(相信大家已经没有了对C指针的恐惧)。什么?你还没看过,我们当年读大学不是这么读的 ,哈哈没看过的铁汁,可以点击详解C指针传送门,学习完后记得回来吖~
建议:尝试自己做一遍,再校对答案,如此食用,味道更佳~
一、数组专项训练
1.一维数组 1.1.整型数组
- 老生常谈的数组名相关:
数组名代表整个数组:
①sizeof(数组名):仅数组名单独放在( )
里
②&数组名
除了这两种情况,数组名都是数组首元素的地址。strlen()
sizeof()
strlen()
: C 库函数size_t strlen(const char *str)
计算字符串str
的长度,直到空结束字符('\0')
,但不包括空结束字符('\0')
。sizeof()
: 是一个操作符(运算符),sizeof是用来计算变量所占内存空间的大小,任何类型都可以使用,只关注空间大小,不会涉及到对这个空间的访问。
总结一句就是 sizeof 计算的是变量的大小,而 strlen 计算的是字符串的长度,前者不受字符 \0 影响,后者以 \0 作为长度判定依据。
:整型数组
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
解析如下:
1.2.2.字符数组与strlen()函数首先,我们要区分如下两种字符数组形式:首先,我们要清楚
arr1
arr2
文章图片
文章图片
解析: 1??
文章图片
解析: 2??
文章图片
解析: 3??
文章图片
解析: 4??
文章图片
解析: 5??
文章图片
解析: 6??
文章图片
解析: 7??
文章图片
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));
//随机值
解析如下:
老生常谈的数组名相关::字符数组
数组名代表整个数组:解析: 1??
①sizeof(数组名):仅数组名单独放在( )
里
②&数组名
除了这两种情况,数组名都是数组首元素的地址。
文章图片
解析: 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
? 大佬友链:安然无虞
推荐阅读
- 数据结构|反向遍历单链表 C语言版
- LeetCode编程题解法汇总|力扣解法汇总2039-网络空闲的时刻
- 传感器融合|基于C++完成一个简单的线性卡尔曼滤波器进行传感器融合
- 神经网络|信息瓶颈提出者Naftali Tishby生前指导,129页博士论文「神经网络中的信息流」公布...
- 算法|js算法学习——选择排序
- 算法|[JS][dfs]题解 | #迷宫问题#
- leetcode|leetcode:词典中最长的单词
- LeetCode笔记|力扣4.寻找两个正序数组的中位数(java)
- 数据库|30 道 MySQL 面试题全放送!