嵌入式全栈开发学习笔记---C语言笔试复习大全16

目录

指针和数组

用指针来表示数组

用数组来表示指针

笔试题19


上一篇复习了指针使用时的相关注意事项,这一篇我们开始复习指针和数组

说明:我们学过单片机的一般都是有C语言基础的了,网上关于C语言的资料有很多,大家如果对C语言不熟悉的话可以先去详细学一下,再以这篇博文作为复习资料学习。

这篇博文的目的是复习C语言,我们会陆续以30多个编程题作为复习要点,这30多个编程题基本涵盖了C语言所有的内容了,只要你掌握了这30多个编程题,那么你的C语言基本就没什么问题了。

注意:由于本专栏是嵌入式全栈开发专栏,为了我们能熟悉以后实际工作中的开发环境,我们写C语言全部在Linux中的vim编辑器中写,这么做事为了我们能够熟练掌握Linux系统的常用命令以及Linux上的vim编辑器的常用工作命令,以达到对口训练的目的!

vim编辑器的一些工作命令在上一篇博文中已经详细介绍过了,如果不了解可以先去看看。

我们正式开始:

指针和数组

用指针来表示数组

数组名就是数组首元素地址,指针用来保存地址数据。于是可以这样写:

int *p = a; //a是一个数组

下面就可以通过指针来访问数组。

*p表示a[0]    也可以写成p[0]

*(p + 1)表示a[1]  也可以写成p[1]

*(p + 2)表示a[2]  也可以写成p[2]

...

用数组来表示指针

指针就是数组、数组就是指针,可以这么说,但是不严谨

可以通过数组的形式访问指针指向的内容

char *ptr = “helloworld”;

ptr[0]表示字符'h'

ptr[1]表示字符'e'

....

笔试题19

int a[5] = {1, 2, 3, 4, 5};

int *p1 = (int*)(&a + 1);

int *p2 = (int*)((int)a + 1);

int *p3 = (int*)(a + 1);

p1[0], p2[0], p3[0]的值分别为多少?

解:

int *p1 = (int*)(&a + 1);//&a是取整个数组的地址,数组地址加1就跨越这个数组。&a + 1已经跳到了数组a的外面,再强制类型转换成int*,不强转也可以,因为&a + 1本身就是int*,只是不强转的话含义是不一样的,原来是一个地址,强转后是一个整数类型的地址。值是不变的,只是含义不一样。最后再赋值给int*的指针p1,那p1就指向了0x114这块空间,也就是说p1里面存的值就是0x114,这个0x114可以理解为下一个数组的地址。

int *p2 = (int*)((int)a + 1);//a原本是数组首元素的地址0x100,(int)a强制类型转换成int型的整数,也就是将0x100转换成整数100;然后(int)a + 1,就变成了100+1等于101;(int*)((int)a + 1)再将101强制转换成int*型,也就是将101转换成int*的指针,指向地址0x101,赋值给指针p2,p2也指向0x101,而0x101是数组a首元素的第二个字节的地址

int *p3 = (int*)(a + 1);//a是首元素的地址,+1就变成第二个元素的地址,然后再强制类型转换成int*型的指针,其实(a + 1)本身就是int*,不强制类型转换也可以。最后赋值给p3,于是p3指向第二个元素的地址,也就是0x104。

以上只有p3是一个正常的指针,其他两个都是不正常的,因为在C语言中访问数组的时候一定是从数组的首元素的地址开始访问的,访问其他元素的地址一定是该数组元素类型的整数倍。比如说数组元素类型是int,那么指针指向的地址一定是int型的整数倍,0x100,0x104,0x108......正常情况下不可能是某个元素的某一个字节的地址,也不可能是指向数组所在的内存空间外的其他区域。

综上:

p1[0]代表的是:p1是指针,取指向的空间的第一个元素。而p1指向的是0x114,已经越界了,没有那个元素,没有那个数字,结果可能是“段错误”,也有可能是个随机值。

p2[0]代表的是:p2是指针,取指向的空间的第一个元素。而p2指向的是0x101,这个指针也不是正常的指针,结果可能是“段错误”,也有可能是个随机值。

p3[0]代表的是:p3是指针,取指向的空间的第一个元素。而p3指向的是0x104,结果是2。

以上就是这篇内容,如想了解更多,欢迎订阅本专栏!

如有问题可评论区或者私信留言,如果想要进交流群请私信!

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vera工程师养成记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值