参考:
- 指针是一种比较奇怪的数据类型,先说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