指针的理解

参考:

C语言指针变量的定义和使用(精华)数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为 指针变量 。 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。指针变量的值就是http://c.biancheng.net/view/1991.html

  • 指针是一种比较奇怪的数据类型,先说int, float, char这些类型很好理解,比如int a = 100; 代表有一个内存地址(&a),内存里面存的数(a)是100。
  • int a = 100;
    int* b = &a;

    这又什么意思呢?要对比着int a = 100;来理解,int* 等同于int,是数据类型。那么依照int a =100;的理解方式:有一个int*类型的数据内存地址(&b),里面的内容(b)是&a。就这么看似乎没什么难的。比如这个例子可以验证。

    {
        int a = 100;
        int *b = &a;
        printf("a = %d, &a = %p\n", a, &a);
        printf("b = %p, &b = %p\n", b, &b);
    }
  • 打印结果:

a = 100, &a = 0x7ffeaab87b9c

b = 0x7ffeaab87b9c, &b = 0x7ffeaab87ba0

可以容易的看出b的内容为0x7ffeaab87b9c,这是a的地址,也就是赋值的结果:b = &a;和a = 100;是一个意思。

  • 那如果我有a的地址(&a)我就可以访问a的内容(*(&a)):比如这样:

    {
        int a = 100;
        printf("a = %d\n", *(&a)); // 结果为100
    } 

道理是这样的:通过*访问(&a)地址0x7ffeaab87b9c的内容。

  • 那么有意思的就来了,既然b的内容是a的地址,那我可以通过b来访问a的结果吗?
    {
        int a = 100;
        int *b = &a;
        printf("a = %d\n", *b);
    }

其实道理是一样的:通过*访问地址0x7ffeaab87b9c的内容。因为b= &a; 所以*b 等同于*(&a)这个操作。

  • 那么我能通过b访问的这个内容返回去访问a的地址吗?
    {
        int a = 100;
        int* b = &a;
        printf("&a = %d\n", &(*b)); //打印a的地址
    }

指针的内存分布

比如定义变量int b = 10;

int* p = &b;  //等价于 int *p; p= &b;

  • int b =10;

b的地址0x0000ff00, b的内容10

  • int* p;

p的地址 &p , p的内容未知

  • p = &b;

 p的内容是0x0000ff00

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值