C语言指针讲解

嵌入式技术

1343人已加入

描述

C语言可以说是工科学生必不可少的编程语言了,尤其是嵌入式的应用中C语言更是大厦之基,甚至在我的评价里他相比于数学对于工科生的作用等价。

在学习C语言之初就有一个说法是:学明白了指针,就学明白了C语言。那么什么是指针?

在计算机中,所有的数据都是存放在存储器中的,不同的数据类型占有的内存空间的大小各不相同。内存是以字节为单位的连续编址空间,每一个字节单元对应着一个独一的编号,这个编号被称为内存单元的地址。

如果说把存放数据的空间当作我们家的小区,那么地址就像是门牌号,每家每户的地址都是唯一且固定不变的。

此时如果有一名访客来找你,你可以告诉这位访客你家的地址,也就是门牌号。访客可以直接通过门牌号来找到你。

在C语言中我们可以通过 & 来获得门牌号也就是变量的地址。并且可以通过 * 去访问这个地址,并进行修改,这叫做引用 与 解引用。

指针

图1 变量的地址与访问

当然也有除了直接寻找门牌号之外,还有一种方式找到你家——问路当你到你朋友的小区时,你不知道朋友住哪里,但是朋友刚刚玩完钢铁雄心没注意时间现在睡着了,那么你可能会询问门口保安:NT的家住哪?保安会说:NT住某某幢某零某。此时这个NT的家起到了和一个门牌号一样的作用或者说NT从某种意义上来说他和NT家的地址是等价的。

而C语言中,NT的家等价于NT家的地址,这叫做指针。指针是一种类型,他的作用就是指向变量的地址并可以读取和修改。

首先,使用指针的前提是变量已经存在(还有一种空指针NULL),就像如果NT不在小区买房,那么门口保安肯定是不知道NT的家在那的甚至会不让你进小区(系统报错)。

指针

图2 通过指针访问

此时int * NT = &home 就像是小区业主在登记信息,向大伙说明,这个地址是NT的家,你可以直接问NT的家在哪来访问我。

使用 变量类型 + * + 指针名 = & 变量名的方式来定义和声明变量,注意的是,指针类型必须进行初始化,哪怕是你说不进去找人,只是空逛逛小区,也就是空指针 如 int * NT = NULL;

既然可以通过NT这个别称来寻找到NT的家,那么同理一个地址可以被多个指针所指向(可能是NT老婆的名字,NT儿女的名字)

指针

图3 多个指针访问一个变量

那么指针的作用是什么呢?

指针最基本的一个作用是值传递和地址传递。通常我们在定义一个函数的时候,其变量类型是数据变量,如下图所示,x和y的类型都是int,这个a和b叫做行参,即我们在定义函数的时候写的参数,而当我们调用这个函数的时候,传入的参数x和y叫做实参。

指针

图4 行参与实参

那么a,b,x,y到底是什么关系呢?其实我们可以观察他们的地址,我们发现,实际上我们将x,y传入函数的时候,函数新创建了两个变量a 和b
来存放我们x和y的数据并进行运算,等到这个函数运行完毕再释放掉a和b这两个数据(拆迁)

指针

图5 行参与实参的地址

而当我们在函数中改变a和b的值的时候,x和y的值并没有发生改变(抓周树人,管我鲁迅什么事?)

然鹅,当我们把函数的数据类型换成指针时,我们就可以在函数中改变外部实参的值。事实上函数中也创建了一个形参,不过这个形参的是一个指针类型的(和实参类型相同)而他和我们传入的实参所指向的地址是同一个地址,因此我们通过解引用行参来修改实参的值。我们把这种叫做地址传递,意思是将指针(变量的地址)作为数据传入函数。

指针

图6 地址传递

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分