C语言的指针到底是个什么鬼,怎么用?

学数据结构时,创建链表,他定义了个二级指针,很懵逼,所以就有了这篇博客。指针的* 有啥用?
在我看来就像打排位匹配对手一样,什么样的段位匹配什么样的对手。就比如我是黑铁4,就匹配不到最强王者。

了解你定义的变量,是怎么来的:

首先我们来看基本数据类型,int a = 100, a在内存中,是怎么保存的呢,首先开辟一个内存,地址如:0X61,然后他代表的值是100。

然后再来看 一级指针变量 int *p1 = &a,我们首先还是需要去内存中开辟一个空间,然后假如 p1这个指针的值是 0X62 ,然后注意了,我们也给p1这个指针,赋值了的,所以他就指向 a 的地址: 0X61。

最后就是二级指针变量了, int **p2 = &p1, 如上,**p2的地址值为 0X63,他指向的值就应该是 p1的地址值 。

如下图:

二级指针.png

总结一下:

这时候你应该悟了,其实每个变量(无论是指针变量还是基本数据类型)都应该有两个值,一个是自己的地址值,一个是装(储存)的值,只不过基本类型和指针装的不一样,一个装数据,一个装地址。

对于int a来说,他的地址是0X61,他装的是100,而对于一级指针int *p1来说,他的地址是0X62,而他装的是 a的地址0X61,对于int **p2来说,他的地址是0X63,而他装的是 *p1的地址 0X62;

柯南时间到:

现在就来揭秘,指针前面那个 * 有啥用(我们要知道这玩意有啥用,最有利的证据,就是用代码输出结果):

#include <stdio.h>
int main(){
    int a =100;
    int *p1 = &a;
    int **p2 = &p1;
    int ***p3 = &p2;
    printf("%d, %d, %d, %d\n", a, *p1, **p2, ***p3);
    printf("&p2 = %#X, p3 = %#X\n", &p2, p3);
    printf("&p1 = %#X, p2 = %#X, *p3 = %#X\n", &p1, p2, *p3);
    printf(" &a = %#X, p1 = %#X, *p2 = %#X, **p3 = %#X\n", &a, p1, *p2, **p3);
    return 0;
}
100, 100, 100, 100
&p2 = 0X28FF3C, p3 = 0X28FF3C
&p1 = 0X28FF40, p2 = 0X28FF40, *p3 = 0X28FF40
&a = 0X28FF44, p1 = 0X28FF44, *p2 = 0X28FF44, **p3 = 0X28FF44

我们从结果,再结合书上讲的,就精炼一下嘛,&表示取取变量的地址符号*则表示取值符号,。

  1. 想要获取指针指向的数据时,一级指针加一个*,二级指针加两个*,三级指针加三个*,以次类推。
  2. 而如果指针少一个*,就表示,指针指向数据的地址值。
  3. 而指针不加 *,就表示自己储存的什么值(你看a是不是就为100,100就是他储存的值嘛)。

结合这个图来看:
二级指针.png

我二级指针,有两个*,就直接可以指到a装的数据了,而少了一个*就代表指向a的地址值(即指向的p1储存的值)。那再少一个就只能指到自己了嘛,那不就是自己储存的p1的地址值吗。

由此我们可以发现,指针的*就像一个打排位,什么样的段位匹配什么样的段位,几个*就指向那个值。

哎指针也就那么回事嘛,就这? 哈哈,开个玩笑。

推荐阅读:http://c.biancheng.net/view/2016.html

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值