✅ 字符指针笔试题解析
printf(“%d\n”, sizeof( p ));
这里p是个指针变量所以指针大小的字节为 结果为 4/8
- printf(“%d\n”, sizeof( p ));
- 结果为 4/8
printf(“%d\n”, sizeof(p+1));
这里指针变量 p 存放的是字符串常量首元素的地址。加一传过去的就是字符串常量,第二个元素的地址。
- 既然是地址,那么大小就是 4/8
- printf(“%d\n”, sizeof(p+1));
- 结果为 4/8
printf(“%d\n”, sizeof(*p));
指针变量 p 是字符串常量首元素的地址,那么解引用也就是 字符 a
- 所以:printf(“%d\n”, sizeof(*p));
- 结果为 1
printf(“%d\n”, sizeof(p[0]));
p[0] == *(p+0) ==*p,所以跟上题一样要计算的是字符的大小
- 所以:printf(“%d\n”, sizeof(p[0]));
- 结果为 1
printf(“%d\n”, sizeof(&p));
取地址 p 取出来依旧是个地址,没有什么不同的!
- 既然是地址,那么大小就是 4/8
- printf(“%d\n”, sizeof(&p));
- 结果为 4/8
printf(“%d\n”, sizeof(&p+1));
取地址 &p 加一,只是跳到p指向的空间,的下一个地址。所以 (&p+1)
传过去的还是地址
- 既然是地址,那么大小就是 4/8
- printf(“%d\n”, sizeof(&p+1));
- 结果为 4/8
printf(“%d\n”, sizeof(&p[0]+1));
取字符串常量的第一个地址 + 1,传过去的是字符串常量的第二个元素 b 的地址
- 既然是地址,那么大小就是 4/8
- printf(“%d\n”, sizeof(&p[0]+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));
✅ 字符指针笔试题解析
printf(“%d\n”, strlen§);
有了开头讲的关于字符指针的描述那就简单多了,字符指针 p
里存放的是字符串常量的首地址。所以传给 strlen 的也是字符串常量的首地址。
- 所以:printf(“%d\n”, strlen( p ));
- 结果为 6
printf(“%d\n”, strlen(p+1));
指针p加一就指向了,第二个元素的地址那么计算字符串长度就是从第二个元素开始计算的!
- 所以:printf(“%d\n”, strlen( p ));
- 结果为 5
printf(“%d\n”, strlen(*p));
这里还是和前面一样的错误如果对 指针变量进行解引用 那么传过去的就是 指针变量所指向的值 a
- 所以这里程序会发生崩溃!
printf(“%d\n”, strlen(p[0]));
这里还是和前面一样的问题对指针进行下标访问,就会导致传给 strlen() 的是指针p 所指向空间的值!
- 所以这里程序会发生崩溃!
printf(“%d\n”, strlen(&p));
这里取出的指针变量的地址,可是指针变量的地址在哪里我们并不会知道所以这里strlen计算的就是随机值!
- 所以:printf(“%d\n”, strlen(&p));
- 结果为 随机值
printf(“%d\n”, strlen(&p+1));
取指针变量p 地址,加一那么传过去的指针变量下一个内存单元里面的地址,而这个地址在哪里我们并不知道!
- 所以:printf(“%d\n”, strlen(&p+1));
- 结果为 随机值
printf(“%d\n”, strlen(&p[0]+1));
哦豁!这里就要注意了, [ ] 的优先级比 &取地址操作符优先级高。所以我们p[0]先找到常量字符串 a 这个元素在进行取地址,然后加一找到的是第二个元素的地址。
- 所以:printf(“%d\n”, strlen(&p[0]+1));
- 结果为 5
💭 二维数组笔试题
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)));
✅二维数组笔试题解析
printf(“%d\n”,sizeof(a));
做这种题,我们都做出经验了。只需要先判断 a的类型是什么。他是数组名,又在sizeof()里面单独存在那么 ,sizeof计算的就是整个数组的大小!
- printf(“%d\n”,sizeof(a));
- 结果为 3*4*4 = 48
printf(“%d\n”,sizeof(a[0][0]));
这里二维数组 a[0][0] 是第一排第一列的元素值,而这个二维数组又是整形的:
- 所以:printf(“%d\n”,sizeof(a[0][0]));
- 结果为 4
printf(“%d\n”,sizeof(a[0]));
这里 a[0]这里是第一排数组的的数组名,又是单独出现在sizeof 里面的。而数组名单独出现在sizeof里面计算的就是整个数组的大小!
- 所以:printf(“%d\n”,sizeof(a[0]));
- 结果为 4*4=16
printf(“%d\n”,sizeof(a[0]+1));
a[0]
作为第一行的数组名,没有单独放在sizeof 内部,没有 &a[0]
表示数组首元素的地址,也就是 a[0][0]
的地址所以 a[0]+1
是第一行第二个元素的地址,是地址就是4/8个字节.
- 所以:printf(“%d\n”,sizeof(a[0]+1));
- 结果为 4/8个字节
printf(“%d\n”,sizeof(*(a[0]+1)));
而这里可以这样理解 *() == [ ] 所以(*(a[0]+1)) == a[0][1] 而这指向的就是二维数组的第一行第二个元素!
- 而这个二位数组又是整形的
- 所以:printf(“%d\n”,sizeof(a[0]+1));
- 结果为 4 个字节
💬 指针练习题
好了给大家讲解了这么多的数组常考面试题,关看着博主写可没有用啊!俗话说:光听不练假把式 。那么接下来就给大家留点练习题自己练习检验检验把!
📚 代码演示:
#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; }
📝全篇总结
✅ 归纳:
☁️ 好了以上就是关于数组类型笔试题要考察的点全部讲解了,不知道大家对数组和数组名是不是有了新的理解呢?
看到这里了还不给博主扣个:
⛳️ 点赞
☀️收藏
⭐️ 关注
!
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。