C 语言指针怎么理解?

本文深入探讨了C语言中的指针概念,包括指针的定义、使用指针的原因、如何通过指针在函数内部修改外部变量、指针算术运算及其背后的类型原理,以及异常指针如空指针和野指针的介绍。通过实例解释了指针在内存操作中的灵活性和潜在风险,帮助读者更好地理解和掌握C语言指针。
摘要由CSDN通过智能技术生成

什么是指针

C语言里,指针一直是一个难点,初学者容易混淆的地方,但是指针本身其实很简单,指针就是一个存放整数的变量。

C语言中,变量存放在内存中,而内存其实就是一组有序字节组成的数组,这些连续的字节从 0 开始进行编号,每个字节都有唯一的一个编号,这个编号就是内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量起始地址的变量

如图为4GB 的内存的分布图:

什么叫做指向变量首地址呢?比如:

int a = 10;
int *p = &a;

用图表示就是: 

 

为什么要使用指针

如果是写过类似Java、kotlin等高级语言的程序员,对引用肯定非常熟悉了,其实引用就是个简洁版的指针,因为指针实在太灵活,用得不好容易出事故,所以这些高级语言就简化为引用。

引用就像普通钥匙,我们可以用它去打开某种类型的门,其他类型数据无法打开,并且就算打开了门的具体编号(地址)也不会暴露给我们。引用不能通过移动位置(算数运算)去打开其他门,只能指定去打开某个门。

而指针虽然也有类型,但是却并不是要求一定要指向该类型的数据(至于指针的类型的作用后面会讲),指针有点像万能钥匙,虽然指定打开这某种门,但是其他门也是可以打开的(当然读取数据可能会有错误),更厉害的是可以移动任意位置(算术运算挪动指针指向)去打开其他门,门牌号(内存地址)也是暴露给我们的。这样会灵活很多,开发者的操作权限会很大,当然带来的风险也会高很多。

(上面的比喻可能不是很恰当或者难以理解,简单来说就是我可以使用指针直接操作内存,读也好,写也好,怎么样都好,内存的数据尽在我手中,内存的命运尽在我手中,我想读哪里的数据,我想往哪里写什么数据,都随我意。所以一旦操作不当,就会有程序事故,比如访问到没有访问权限的内存导致程序奔溃,比如常见的数组越界和野指针访问就是这个原因导致的奔溃)

总的来说,使用指针有如下好处:

1)指针的使用使得不同区域的代码可以轻易的共享内存数据,这样可以使程序更为快速高效;

2)C语言中一些复杂的数据结构往往需要使用指针来构建,如链表、二叉树等;

3)C语言是传值调用,而有些操作传值调用是无法完成的,如通过被调函数修改调用函数的对象,但是这种操作可以由指针来完成,而且并不违背传值调用。

4)可以通过算术运算灵活操作内存。

1和2比较容

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值