乐趣区

关于c:指针到底是个什么鬼怎么用

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

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

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

而后再来看 一级指针变量 int *p1 = &a, 咱们首先还是须要去内存中开拓一个空间,而后如果 p1 这个指针的值是 0X62,而后留神了,咱们也给 p1 这个指针,赋值了的,所以他就指向 a 的地址: 0X61。

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

如下图:

总结一下:

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

对于 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 就是他贮存的值嘛)。

联合这个图来看:

我二级指针,有两个*,就间接能够指到 a 装的数据了,而少了一个 * 就代表指向 a 的地址值(即指向的 p1 贮存的值)。那再少一个就只能指到本人了嘛, 那不就是本人贮存的 p1 的地址值吗。

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

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

举荐浏览:http://c.biancheng.net/view/2…

退出移动版