打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C语言的灵魂|“指针”

什么是指针?从根本上看,指针是一个值为内存地址的变量。

——《C primer plus》

指针,一直都是C语言的重点。初学C的人可能只是知道,它是变量的地址,但却不知道,学这个变量的地址有什么用。指针的伟大之处其实并不在语言本身,而是在于它和结构体搭配产生的一种叫数据结构的东西。如链表队列栈,树图等。所以,虽然在现在指针用到的地方不多,但还是要好好掌握这个知识。

&和*

在我们之前有学到那么一个运算符是&取地址符,它的作用是返回变量的地址,我们现在要获取一个变量的地址,让它赋值给一个指针变量,可以这样子操作。

1inta=0;

2int*p=&a;

这样我们就把a的地址赋值给了p这个指针变量,注意指针变量是p而不是*p。上面也代表着p这个指针变量指向了a。如果你想声明double类型的指针就可以把上面两个都换成double。为什么都要换掉,去区分开不同类型的指针呢?每个指针变量的空间大小都是一样的,因为它只是储存地址,都是指针变量。既然用到的空间一样,那我们指针就指针呗,要区分int,double指针干嘛。这个问题我们留到下面指针的加法来讨论。

指针的存储

指针是按照16进制储存在指针变量中的,用%p对一个指针变量进行printf操作,可以得到指针的16进制地址。

这样子,就是把p所指的内容a赋值给了x。

1printf('%p',p);

指针的操作

对于* 这个运算符,用在声明的时候表示的是声明一个指针变量,就像上面那样。声明了一个int型的指针变量。

除了声明之外,用*对一个变量进行操作就可以对它地址上的内容,也就是这个指针所指的变量进行操作。如赋值:

1intx=*p;

这里我们就将p这个指针变量所指向的内容。如果p指向的是a变量,那么给x赋值的就是a的值。

解引用后的四则运算

1(*p)=(*p)+1;

为什么要括号呢,因为在这里我们可以更加直观的看出,是p指向的指针在进行加法而不是p这个指针变量在进行加法。

指针与一维数组

在上一篇的数组中,我们讲到了数组名是数组的地址,而在这篇文章中,我们又提到了指针是一个储存地址的变量,那这样的话,数组和指针是有关联的。

如果我们要数组第一个元素的地址,可以如下

1inta[10];

2int*p=&a[0];

如果我们要数组的地址,可以如下

1int*q=a;

我用%p打印出来出来后是下面这两个(不同机器的地址会和这里不一样)

1000000000065FE20

2000000000065FE20

虽然它们的地址是一样的,但是这两个指针的类型是不一样的,第一个指的是数组的第一个元素的地址,第二个指的是整个数组的地址。

指针+整数

当给指针加上整数的时候,因为指针指的是地址,所以当我们用指针加整数的时候就是原来的地址加上指针类型*要加的整数。

就拿一个小区来说,每个房子之间的距离是4米(模拟int的字节数)。如有一家的门牌号是3。你给地址加一个数字,它的地址会加上4乘上这个小区的房子距离。就会是第4个门牌号的房子的地址。

如果你在另一个小区,房子间的距离比较大了,为8米(模拟double的字节)。也是假如有一家的门牌号是3。你给地址加一个数字,那么这个时候,给地址加上的应该是这个小区的房子距离8乘以加的数字。才可以得到准确的房子地址。

这就为什么我们要区分不同的指针类似了。在两个小区中,计算一开始的地址都是3,但是因为小区的房子间距不一样,所以它们需要加的那个数字就会因为这个距离而变化,不只是看这个整数。

举一个数组和指针的例子

1inta[10];

2printf('%d',*(a+3));

以上会打印出a[3]这个变量,因为我们在解引用前先对指针+3,让它移动到了a[3]的位置。给他解引用后就是a[3]的值了。

指针减整数

这个指针减去整数就和上面的指针加整数差不多,就是减去指针类型*要减的整数。要注意的是当它用在数组名上时,不要让指针指在数组外面。

指针减指针

可以想一下,当两个门牌号相减的时候会得到什么?是两个房子的门牌号之差,而不是两个房子的距离。这里要注意的是,指针减指针一般是用在数组中,例如

1inta[10]

2intx=&a[3]-&a[0];

这就是指针的一些基本知识了,关于二维数组用指针表示,这里不多写了。如果你觉得不懂这二维数组和指针的关系的话,或者对于文章内容有什么建议,可以关注我,我来替你解答!

“全球最大的C/C++人员聚集地就在我这里,企鹅裙馊直播编程学习,【14】就是我的。不管你是什么基础,来了就是兄弟,是兄弟就跟我一起学习C/C++!关注我,为编程点赞,每天学点小知识!工作需要、感兴趣、为了入行、转行需要学习C/C++的伙伴可以跟我学习,技术大牛、学习资料等助你早日成为一名优秀的程序员!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C/C++知识教程:指针
深入理解C语言指针的奥秘(3)
c语言要背的
UC头条:C语言学习分享(第三次)
第8章 指针
指针数组与数组指针
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服