📋 前言
🌈hello! 各位宝子们大家好啊,数组和指针系列我们全部讲解完毕了,那么今天就来看一下数组的笔试题!
⛳️面试题下章就进阶一些的知识了,会用到字符指针和二维指针嗷,俗话说有难度才有进步呢!大家加油嗷!
📚本期文章收录在《C语言进阶篇》,大家有兴趣可以看看呐!
⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!
🔥 注:上一章链接在这里《数组笔试题万字解析(上)》
💬 数组笔试题解析
在做数组笔试题之前我们需要明白这俩个点就可以了 数组名的意义:
sizeof
(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。&
数组名 ,这里的数组名表示整个数组,取出的是整个数组的地址。- 除此之外所有的数组名都表示首元素的地址。
💭 字符数组笔试题
诶这里我们就对上次的题目做了改变不在使用单个字符赋值了,而是直接使用字符串进行赋值。
- 而字符数组使用字符串赋值会在结尾自动补上
\0
- 这样字符数组的长度就会加
1
,所以数组的长度就是7- 知道了这一点我们下面的题目就变得简单起来了
这里我们使用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));
✅ 字符数组笔试题解析
printf(“%d\n”, sizeof(arr));
这里计算的是整个数组的大小,而我们字符数组的有 7个字符类型的元素!
- 所以printf(“%d\n”, sizeof(arr));
- 的结果为 7
printf(“%d\n”, sizeof(arr+0));
这里arr明显不是整个数组的大小,而arr数组名又是首元素的地址。+0 等于没加吗计算的就还是地址!
- 既然是地址,那么大小就是 4/8
- printf(“%d\n”, sizeof(arr+0));
- 结果为 4/8
printf(“%d\n”, sizeof(*arr));
arr是数组首元素的地址,那么在进行解引用不就是找到数组的第一个元素嘛?而数组的第一个元素是 char 类型的!
- 所以:printf(“printf(”%d\n", sizeof(*arr));
- 结果为 1
printf(“%d\n”, sizeof(arr[1]));
这里计算的是 arr 字符数组第二个元素的地址所以:
- printf(“%d\n”, sizeof(arr[1]));
- 结果为 1
printf(“%d\n”, sizeof(&arr));
这里取出的肯定是整个数组的地址,而整个数组的地址也是地址
- 既然是地址,那么大小就是 4/8
- printf(“%d\n”, sizeof(&arr));
- 结果为 4/8
printf(“%d\n”, sizeof(&arr+1));
这里取整个数组的地址进行加 1,那么就是指向数组的下一个空间的地址。而下一个空间的地址也是地址。
- 既然是地址,那么大小就是 4/8
- printf(“%d\n”, sizeof(&arr+1));
- 结果为 4/8
printf(“%d\n”, sizeof(&arr[0]+1));
这里取出数组第一个元素的地址,然后加一指向的就是数组的第二个元素的地址,而数组第二个元素的地址也是地址!
- 既然是地址,那么大小就是 4/8
- printf(“%d\n”, sizeof(&arr[0]+1));
- 结果为 4/8
💭 字符数组笔试题解析 (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 是用来计算字符串长度的
- 从我们给定地址一直计算到
\0
的位置- 找不到
\0
就会一直往后计算字符长度只到找到 \0
printf(“%d\n”, strlen(arr));
这个地方数组是首元素的地址,strlen 是从我们所给定的地址计算一直到 \0
, 的长度。这这个字符数组占7个大小,最后一位是 \0
。
- 所以:printf(“%d\n”, strlen(arr));
- 结果为 6
printf(“%d\n”, strlen(arr+0));
这里 arr 还是数组首元素的地址,而加零等于没加,所以传过去的还是指针的首元素地址!
- 所以:printf(“%d\n”, strlen(arr+0));
- 结果为 6
printf(“%d\n”, strlen(*arr));
哦豁这里 arr 是首元素地址,而对地址进行解引用。找到到就是字符数组第一个元素的值,strlen需要的是地址我们怎么能给它传值呢?
- 所以这里程序就崩溃
printf(“%d\n”, strlen(arr[1]));
这里也是一样我们传过去的是,字符数组第二哥元素的值!strlen需要的是地址我们怎么能给它传值呢?
- 所以程序还是会崩溃
printf(“%d\n”, strlen(&arr));
这里arr是首元素的地址,等价于&arr。所以我们传过去的还是首元素地址!
- 所以:printf(“%d\n”, strlen(&arr));
- 结果为 6
printf(“%d\n”, strlen(&arr+1));
这里arr是元素的地址,首元素的地址 +1 。那么传过去的不就是数组第二个元素的地址。
- 所以:printf(“%d\n”, strlen(&arr+1));
- 结果为 5
printf(“%d\n”, strlen(&arr[0]+1));
&arr[0]也是数组第一个元素的地址,加一那么传过去的不就是数组第二个元素的地址。
- 所以:printf(“%d\n”, strlen(&arr[0]+1));
- 结果为 5
💭 字符指针笔试题
这里考察就是我们对字符指针的理解了,不知道大家还记得字符指针里面存放的是什么嘛?
- 字符指针里面存放的是 【 a b c d e f \0】。
- 这个常量字符串的首地址 a
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));