(文章目录)
📋 前言
<font color = green >🌈hello! 各位宝子们大家好啊,数组和指针系列我们全部讲解完毕了,那么今天就来看一下数组的笔试题!</font> <font color = green >⛳️本章笔试题主要考察的是数组名和 &数组 的区别,看完本章相信你对数组名和 &数组又会有新的理解!</font> <font color = Orange >📚本期文章收录在《C语言进阶篇》,大家有兴趣可以看看呐!</font> <font color = purple>:tent: 欢迎铁汁们 :heavy_check_mark: 点赞 👍 收藏 ⭐留言 📝!</font>
💬 数组笔试题解析
在做数组笔试题之前我们需要明白这俩个点就可以了 数组名的意义:
sizeof
(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。&
数组名 ,这里的数组名表示整个数组,取出的是整个数组的地址。- 除此之外所有的数组名都表示首元素的地址。
💭 一维数组笔试题
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));
✅ 一维数组笔试题解析
<kbd>printf("%d\n",sizeof(a));</kbd>
这个就很直观了, sizeof
(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
- 所以<kbd>printf("%d\n",sizeof(a));</kbd>
- 结果为 ==<font color = red> 16 </font>==
<kbd>printf("%d\n",sizeof(a+0));</kbd>
这里大家不要被 sizeof
(数组名)给迷糊了,虽然这里是数组名但他是首元素地址,因为指针单独是数组名才是整个元素的地址!
- 既然是首元素地址,那么就是指针类型的 4 / 8个字节
- <kbd>printf("%d\n",sizeof(a+0));</kbd>结果为 ==<font color = red> 4/8 </font>==
<kbd>printf("%d\n",sizeof(*a));</kbd> 首先排除 a 是整个数组的大小,因为这里还对a进行解引用了。所以这里的 a 指的是首元素的地址,那么对他进行解引用就找到数组的第一个元素,而数组的第一个元素是整形。
- 那么<kbd>printf("%d\n",sizeof(*a));</kbd>
- 结果为 ==<font color = red> 4 </font>== 个字节
<kbd>printf("%d\n",sizeof(a+1));</kbd> 也是一样既然不是单纯的数组名,那么a就是首元素地址,首元素地址 +1 就第二个元素的地址。
- 而第二个元素的地址,也是地址那么就是指针类型的
- <kbd>printf("%d\n",sizeof(a+1));</kbd>
- </kbd>结果为 ==<font color = red> 4/8 </font>==
🔥 ==<font color = red>注:这里运用了指针的运算不会的可以看看这章《指针的运算》。</font>==
<kbd>printf("%d\n",sizeof(a[1]));</kbd> 这里就计算就是数组第一个元素的大小,而数组第一个元素的大小是整形的。
- <kbd>printf("%d\n",sizeof(a[1]));</kbd>
- </kbd>结果为 ==<font color = red> 4 </font>==
<kbd>printf("%d\n",sizeof(&a));</kbd>
诶这里有人就会犯迷糊了,&
取地址 a
取出的是整个数组的地址就会认为是 16
,而整个数组的地址也是地址。
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n",sizeof(&a));</kbd>
- </kbd>结果为 ==<font color = red> 4/8 </font>==
<kbd>printf("%d\n",sizeof(*&a));</kbd> 这里其实可以有俩种方法理解:
📜方法一: &地址取出的是整个数组的地址,但是又进行解引用了。这不就刚好抵消了。
- <kbd>sizeof(*&a) == sizeof(a)</kbd>这里就整个数组的大小了
- 所以<kbd>printf("%d\n",sizeof(*&a));</kbd>
- </kbd>结果为 ==<font color = red> 4/8 </font>==
📜方法二:
&地址取出的是整个数组的地址,但是又进行解引用了之后。拿出的就是整个数组 而这个数组 <kbd>int a[ ] = {1,2,3,4};</kbd>是 4
个整形元素那么就 16
个字节
- 所以<kbd>printf("%d\n",sizeof(*&a));</kbd>
- </kbd>结果为 ==<font color = red> 4/8 </font>==
<kbd>printf("%d\n",sizeof(&a+1));</kbd>
这里我们取出的是整个数组的地址,但是又进行 +1
了。直接跳过整个数组加1 ,但他依旧是个地址。
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n",sizeof(&a+1));</kbd>
- </kbd>结果为 ==<font color = red> 4/8 </font>==
<kbd>printf("%d\n",sizeof(&a[0]));</kbd> 这里 & 取地址操作符取得数组的一个元素的地址
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n",sizeof(&a[0]));</kbd>
- </kbd>结果为 ==<font color = red> 4/8 </font>==
<kbd>printf("%d\n",sizeof(&a[0]+1));</kbd>
&
取数组的第一个元素的地址 +1
,那不就取第素组第二个元素的地址嘛?
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n",sizeof(&a[0]+1));</kbd>
- </kbd>结果为 ==<font color = red> 4/8 </font>==
✅ 一维数组笔试题验证
好了笔试题我们分析完了,下面就该来到验证环节了!看一下咱们的分析对还是不对 !
🔥 ==<font color = red>注:这里的4 或者 8 是指 在32位机器上地址长度为 4 。64位机器上地址长度为 8</font>==
📚 代码演示:
#include <stdio.h>
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//16
printf("%d\n", sizeof(a + 0));// 4或8
printf("%d\n", sizeof(*a)); // 4
printf("%d\n", sizeof(a + 1));// 4或8
printf("%d\n", sizeof(a[1]));// 4
printf("%d\n", sizeof(&a));// 4或8
printf("%d\n", sizeof(*&a));// 16
printf("%d\n", sizeof(&a + 1));// 4或8
printf("%d\n", sizeof(&a[0]));// 4或8
printf("%d\n", sizeof(&a[0] + 1));// 4或8
return 0;
}
📑 代码结果:
💭 字符数组笔试题
char arr[] = {'a','b','c','d','e','f'};
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));
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));
✅ 字符数组笔试题解析
<kbd> printf("%d\n", sizeof(arr));</kbd> 这个和我们前面是一样只不过变成了字符数组,但计算的仍然是整个数组的大小。
- 所以:<kbd> printf("%d\n", sizeof(arr));</kbd>
- 大小为 ==<font color = red>6</font>==
<kbd> printf("%d\n", sizeof(arr+0));</kbd>
arr 这里并不是只有数组名,所以arr
数组名这里指的是首元素的地址,+0
等于没有加所以还是首元素的地址。
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n", sizeof(arr+0));</kbd>
- ==<font color = red></kbd>结果为 4/8 </font>==
<kbd>printf("%d\n", sizeof(*arr)); </kbd> 这里 arr 是数组首元素那么对其解引用就是找到这个地址里面存放的内容,而这是个字符类型的元素所以:
- <kbd>printf("%d\n", sizeof(*arr)); </kbd>
- ==<font color = red></kbd>结果为 1 </font>==
<kbd> printf("%d\n", sizeof(arr[1]));</kbd> 这里<kbd> arr[1]</kbd>是数组的第二个元素,而数组又是字符类型的所以:
- <kbd>printf("%d\n", sizeof(arr[1])); </kbd>
- ==<font color = red></kbd>结果为 1 </font>==
<kbd> printf("%d\n", sizeof(&arr));</kbd> 这里数组取出的是整个数组的地址所,但数组的地址也是地址。
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n", sizeof(&arr));</kbd>
- ==<font color = red> </kbd>结果为 4/8 </font>==
<kbd> printf("%d\n", sizeof(&arr+1));</kbd> 这里是取出数组整个元素的地址 +1 ,那么就数组的后一位地址。
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n", sizeof(&arr+1));</kbd>
- ==<font color = red> </kbd>结果为 4/8 </font>==
<kbd> printf("%d\n", sizeof(&arr[0]+1));</kbd>
这里取出的是字符数组第一个元素的地址,+1
就指向了数组的而二个元素的地址
- 既然是地址,那么大小就是 4/8
- <kbd>printf("%d\n", sizeof(&arr[0]+1));</kbd>
- ==<font color = red> </kbd>结果为 4/8 </font>==
💭 字符数组笔试题解析 (strlen)
在做这些面试题之前需要知道 strlen 是干嘛的?strlen 是用来计算字符串长度的
- ==<font color = red>从我们给定地址一直计算到
\0
的位置</font>==- ==<font color = red>找不到
\0
就会一直往后计算字符长度只到找到 \0</font>==
✅ 字符数组(strlen)的考察
<kbd>printf("%d\n", strlen(arr)); </kbd>
因为字符数组arr中没有 \0
,所以在求字符串长度的时候,会一直往后找,产生的结构就是随机值
- ==<font color = red>因为 strlen 找不到 \0 就会一直往后计算字符长度只到找到 \0</font>==
- 所以<kbd>printf("%d\n", strlen(arr)); </kbd>
- 是随机值
<kbd> printf("%d\n", strlen(arr+0));</kbd> 这个情况依旧和前面一样,arr + 0是首元素的地址,和第一个一样,也是随机值
- 所以<kbd>printf("%d\n", strlen(arr+0)); </kbd>
- ==<font color = red>是随机值</font>==
<kbd> printf("%d\n", strlen(*arr));</kbd>
这里就完全错误了,strlen
需要的是地址。而你解引用给我传过来一个元素所以程序一定会崩溃。
<kbd> printf("%d\n", strlen(arr[1]));</kbd> 这里和前面一样的错误,我们需要的是地址。而你传的却是元素,这时程序就会崩溃!
<kbd> printf("%d\n", strlen(&arr));</kbd> 这里还是一样的传过去的是字符数组第一个元素的地址,但是没 \0 做为字符结束的标志所以还是随机值。
<kbd> printf("%d\n", strlen(&arr+1));</kbd> 这里还是一样的传过去的是字符数组第二个元素的地址,但是没 \0 做为字符结束的标志所以还是随机值。
<kbd> printf("%d\n", strlen(&arr[0]+1));</kbd> 这里还是一样的传过去的是字符数组第二个元素的地址,但是没 \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>