<br>
(文章目录)
📋 前言
<font color = green >🌈hello! 各位宝子们大家好啊,数组和指针系列我们全部讲解完毕了,那么今天就来看一下数组的笔试题!</font> <font color = green >⛳️面试题下章就进阶一些的知识了,会用到字符指针和二维指针嗷,俗话说有难度才有进步呢!大家加油嗷!</font> <font color = Orange >📚本期文章收录在《C语言进阶篇》,大家有兴趣可以看看呐!</font> <font color = purple>:tent: 欢迎铁汁们 :heavy_check_mark: 点赞 👍 收藏 ⭐留言 📝!</font>
🔥 ==<font color = red>注:上一章链接在这里《数组笔试题万字解析(上)》</font>==
💬 数组笔试题解析
在做数组笔试题之前我们需要明白这俩个点就可以了 数组名的意义:
sizeof
(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。&
数组名 ,这里的数组名表示整个数组,取出的是整个数组的地址。- 除此之外所有的数组名都表示首元素的地址。
💭 字符数组笔试题
诶这里我们就对上次的题目做了改变不在使用单个字符赋值了,而是直接使用字符串进行赋值。
- ==而字符数组使用字符串赋值会在结尾自动补上
\0
==- ==<font color = red>这样字符数组的长度就会加
1
,所以数组的长度就是7</font>==- 知道了这一点我们下面的题目就变得简单起来了
这里我们使用vs2022 调试看一下:
- 是不是真的和我们想的是一样存储的
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
✅ 字符数组笔试题解析
<kbd>printf("%d\n", sizeof(arr));</kbd> 这里计算的是整个数组的大小,而我们字符数组的有 7个字符类型的元素!
- 所以<kbd>printf("%d\n", sizeof(arr));</kbd>
- ==<font color = red>的结果为 7</font>==
<kbd>printf("%d\n", sizeof(arr+0));</kbd> 这里arr明显不是整个数组的大小,而arr数组名又是首元素的地址。+0 等于没加吗计算的就还是地址!
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n", sizeof(arr+0));</kbd>
- </kbd>==<font color = red>结果为 4/8 </font>==
<kbd>printf("%d\n", sizeof(*arr));</kbd> arr是数组首元素的地址,那么在进行解引用不就是找到数组的第一个元素嘛?而数组的第一个元素是 char 类型的!
- 所以:<kbd>printf("printf("%d\n", sizeof(*arr));</kbd>
- </kbd>==<font color = red>结果为 1 </font>==
<kbd>printf("%d\n", sizeof(arr[1]));</kbd> 这里计算的是 arr 字符数组第二个元素的地址所以:
- <kbd>printf("%d\n", sizeof(arr[1]));</kbd>
- </kbd>==<font color = red> 结果为 1 </font>==
<kbd>printf("%d\n", sizeof(&arr));</kbd> 这里取出的肯定是整个数组的地址,而整个数组的地址也是地址
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n", sizeof(&arr));</kbd>
- </kbd>==<font color = red>结果为 4/8 </font>==
<kbd>printf("%d\n", sizeof(&arr+1));</kbd> 这里取整个数组的地址进行加 1,那么就是指向数组的下一个空间的地址。而下一个空间的地址也是地址。
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n", sizeof(&arr+1));</kbd>
- </kbd>==<font color = red>结果为 4/8 </font>==
<kbd>printf("%d\n", sizeof(&arr[0]+1));</kbd> 这里取出数组第一个元素的地址,然后加一指向的就是数组的第二个元素的地址,而数组第二个元素的地址也是地址!
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n", sizeof(&arr[0]+1));</kbd>
- </kbd>==<font color = red>结果为 4/8 </font>==
💭 字符数组笔试题解析 (strlen)
char arr[] = "abcdef";
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
✅ 字符数组(strlen)笔试题解析
在做这些面试题之前需要知道 strlen 是干嘛的?strlen 是用来计算字符串长度的
- ==<font color = red>从我们给定地址一直计算到
\0
的位置</font>==- ==<font color = red>找不到
\0
就会一直往后计算字符长度只到找到 \0</font>==
<kbd>printf("%d\n", strlen(arr));</kbd>
这个地方数组是首元素的地址,strlen 是从我们所给定的地址计算一直到 \0
, 的长度。这这个字符数组占7个大小,最后一位是 \0
。
- 所以:<kbd>printf("%d\n", strlen(arr));</kbd>
- </kbd>==<font color = red>结果为 6 </font>==
<kbd>printf("%d\n", strlen(arr+0));</kbd> 这里 arr 还是数组首元素的地址,而加零等于没加,所以传过去的还是指针的首元素地址!
- 所以:<kbd>printf("%d\n", strlen(arr+0));</kbd>
- </kbd>==<font color = red>结果为 6 </font>==
<kbd>printf("%d\n", strlen(*arr));</kbd> 哦豁这里 arr 是首元素地址,而对地址进行解引用。找到到就是字符数组第一个元素的值,strlen需要的是地址我们怎么能给它传值呢?
- 所以这里程序就崩溃
<kbd>printf("%d\n", strlen(arr[1]));</kbd> 这里也是一样我们传过去的是,字符数组第二哥元素的值!strlen需要的是地址我们怎么能给它传值呢?
- 所以程序还是会崩溃
<kbd>printf("%d\n", strlen(&arr));</kbd> 这里arr是首元素的地址,等价于&arr。所以我们传过去的还是首元素地址!
- 所以:<kbd>printf("%d\n", strlen(&arr));</kbd>
- </kbd>==<font color = red>结果为 6 </font>==
<kbd>printf("%d\n", strlen(&arr+1));</kbd> 这里arr是元素的地址,首元素的地址 +1 。那么传过去的不就是数组第二个元素的地址。
- 所以:<kbd>printf("%d\n", strlen(&arr+1));</kbd>
- </kbd>==<font color = red>结果为 5 </font>==
<kbd>printf("%d\n", strlen(&arr[0]+1));</kbd> &arr[0]也是数组第一个元素的地址,加一那么传过去的不就是数组第二个元素的地址。
- 所以:<kbd>printf("%d\n", strlen(&arr[0]+1));</kbd>
- </kbd>==<font color = red>结果为 5 </font>==
💭 字符指针笔试题
这里考察就是我们对字符指针的理解了,不知道大家还记得字符指针里面存放的是什么嘛?
- ==<font color = red>字符指针里面存放的是 【 a b c d e f \0】。</font>==
- ==<font color = red>这个常量字符串的首地址 a</font>==
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));
✅ 字符指针笔试题解析
<kbd>printf("%d\n", sizeof( p ));</kbd> 这里p是个指针变量所以指针大小的字节为 结果为 4/8
- <kbd>printf("%d\n", sizeof( p ));</kbd>
- </kbd>==<font color = red>结果为 4/8 </font>==
<kbd>printf("%d\n", sizeof(p+1));</kbd> 这里指针变量 p 存放的是字符串常量首元素的地址。加一传过去的就是字符串常量,第二个元素的地址。
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n", sizeof(p+1));</kbd>
- </kbd>==<font color = red>结果为 4/8 </font>==
<kbd>printf("%d\n", sizeof(*p));</kbd>
指针变量 p 是字符串常量首元素的地址,那么解引用也就是 字符 a
- 所以:<kbd>printf("%d\n", sizeof(*p));</kbd>
- </kbd>==<font color = red>结果为 1 </font>==
<kbd>printf("%d\n", sizeof(p[0]));</kbd> <kbd>p[0] == *(p+0) ==*p</kbd>,所以跟上题一样要计算的是字符的大小
- 所以:<kbd>printf("%d\n", sizeof(p[0]));</kbd>
- </kbd>==<font color = red>结果为 1 </font>==
<kbd>printf("%d\n", sizeof(&p));</kbd> 取地址 p 取出来依旧是个地址,没有什么不同的!
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n", sizeof(&p));</kbd>
- </kbd>==<font color = red>结果为 4/8 </font>==
<kbd>printf("%d\n", sizeof(&p+1));</kbd>
取地址 &p 加一,只是跳到p指向的空间,的下一个地址。所以 (&p+1)
传过去的还是地址
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n", sizeof(&p+1));</kbd>
- </kbd>==<font color = red>结果为 4/8 </font>==
<kbd>printf("%d\n", sizeof(&p[0]+1));</kbd> 取字符串常量的第一个地址 + 1,传过去的是字符串常量的第二个元素 b 的地址
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n", sizeof(&p[0]+1));</kbd>
- </kbd>==<font color = red>结果为 4/8 </font>==
💭 字符指针(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));
✅ 字符指针笔试题解析
<kbd>printf("%d\n", strlen(p));</kbd>
有了开头讲的关于字符指针的描述那就简单多了,字符指针 p
里存放的是字符串常量的首地址。所以传给 strlen 的也是字符串常量的首地址。
- 所以:<kbd>printf("%d\n", strlen( p ));</kbd>
- </kbd>==<font color = red>结果为 6 </font>==
<kbd>printf("%d\n", strlen(p+1));</kbd> 指针p加一就指向了,第二个元素的地址那么计算字符串长度就是从第二个元素开始计算的!
- 所以:<kbd>printf("%d\n", strlen( p ));</kbd>
- </kbd>==<font color = red>结果为 5 </font>==
<kbd>printf("%d\n", strlen(*p));</kbd> 这里还是和前面一样的错误如果对 指针变量进行解引用 那么传过去的就是 指针变量所指向的值 a
- 所以这里程序会发生崩溃!
<kbd>printf("%d\n", strlen(p[0]));</kbd> 这里还是和前面一样的问题对指针进行下标访问,就会导致传给 strlen() 的是指针p 所指向空间的值!
- 所以这里程序会发生崩溃!
<kbd>printf("%d\n", strlen(&p));</kbd> 这里取出的指针变量的地址,可是指针变量的地址在哪里我们并不会知道所以这里strlen计算的就是随机值!
- 所以:<kbd>printf("%d\n", strlen(&p));</kbd>
- </kbd>==<font color = red>结果为 随机值 </font>==
<kbd>printf("%d\n", strlen(&p+1));</kbd> 取指针变量p 地址,加一那么传过去的指针变量下一个内存单元里面的地址,而这个地址在哪里我们并不知道!
- 所以:<kbd>printf("%d\n", strlen(&p+1));</kbd>
- </kbd>==<font color = red>结果为 随机值 </font>==
<kbd>printf("%d\n", strlen(&p[0]+1));</kbd> 哦豁!这里就要注意了, [ ] 的优先级比 &取地址操作符优先级高。所以我们<kbd>p[0]</kbd>先找到常量字符串 a 这个元素在进行取地址,然后加一找到的是第二个元素的地址。
- 所以:<kbd>printf("%d\n", strlen(&p[0]+1));</kbd>
- </kbd>==<font color = red>结果为 5 </font>==
💭 二维数组笔试题
int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
✅二维数组笔试题解析
<kbd>printf("%d\n",sizeof(a));</kbd> 做这种题,我们都做出经验了。只需要先判断 a的类型是什么。他是数组名,又在sizeof()里面单独存在那么 ,sizeof计算的就是整个数组的大小!
- <kbd>printf("%d\n",sizeof(a));</kbd>
- </kbd>==<font color = red>结果为 3*4*4 = 48 </font>==
<kbd>printf("%d\n",sizeof(a[0][0]));</kbd> 这里二维数组 <kbd>a[0][0]</kbd> 是第一排第一列的元素值,而这个二维数组又是整形的:
- 所以:<kbd>printf("%d\n",sizeof(a[0][0]));</kbd>
- </kbd>==<font color = red>结果为 4 </font>==
<kbd>printf("%d\n",sizeof(a[0]));</kbd> 这里 <kbd>a[0]</kbd>这里是第一排数组的的数组名,又是单独出现在sizeof 里面的。而数组名单独出现在sizeof里面计算的就是整个数组的大小!
- 所以:<kbd>printf("%d\n",sizeof(a[0]));</kbd>
- </kbd>==<font color = red>结果为 4*4=16 </font>==
<kbd>printf("%d\n",sizeof(a[0]+1));</kbd>
a[0]
作为第一行的数组名,没有单独放在sizeof 内部,没有 &a[0]
表示数组首元素的地址,也就是 a[0][0]
的地址所以 a[0]+1
是第一行第二个元素的地址,是地址就是4/8个字节.
- 所以:<kbd>printf("%d\n",sizeof(a[0]+1));</kbd>
- </kbd>==<font color = red>结果为 4/8个字节 </font>==
<kbd>printf("%d\n",sizeof(*(a[0]+1)));</kbd> 而这里可以这样理解 <kbd>*() == [ ]</kbd> 所以<kbd> (*(a[0]+1)) == a[0][1]</kbd> 而这指向的就是二维数组的第一行第二个元素!
- 而这个二位数组又是整形的
- 所以:<kbd>printf("%d\n",sizeof(a[0]+1));</kbd>
- </kbd>==<font color = red>结果为 4 个字节 </font>==
💬 指针练习题
好了给大家讲解了这么多的数组常考面试题,关看着博主写可没有用啊!俗话说:光听不练假把式 。那么接下来就给大家留点练习题自己练习检验检验把!
📚 代码演示:
#include <stdio.h>
int main()
{
int a[3][4] = { 0 };
printf("%d\n", sizeof(a + 1));
printf("%d\n", sizeof(*(a + 1)));
printf("%d\n", sizeof(&a[0] + 1));
printf("%d\n", sizeof(*(&a[0] + 1)));
printf("%d\n", sizeof(*a));
printf("%d\n", sizeof(a[3]));
return 0;
}
📝全篇总结
✅ 归纳:
:cloud: <font color="#006666">好了以上就是关于数组类型笔试题要考察的点全部讲解了,不知道大家对数组和数组名是不是有了新的理解呢?</font>
<font color ="7B68EE">看到这里了还不给博主扣个:
⛳️ 点赞
:sunny:收藏
:star: 关注
!</font>
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
<font size = 5 face = "华文彩云" color =red>拜托拜托这个真的很重要!</font>
<font color="#660066">你们的点赞就是博主更新最大的动力!</font>
<font color="#660066">有问题可以评论或者私信呢秒回哦。</font>