#include <stdio.h>
#include <stdlib.h>
int main()
{
int b=2;
int *a=&b;
/*
int *定义了a,a是指针变量,存放的永远是地址,定义了一个整形指针类型的变量a,指向了整形变量b的地址
//*的作用有两个,这里*的作用是声明指针
//而&的作用是也是两个,引用,获取变量的地址。
//int &a=*b;此时&在左边,是引用b,int a=&b;此时&在右边,是获取地址
*a=5;
//这里的*是另外一个作用,取内容运算符,即解引用,将5替换原来b的地址的值(即3)
//此时注意指针指向地址是变量b的地址,变量b的地址存放的值变成5(原来是2),则b的值也就变成5了。
//如果a=5会怎样,会报错。a=5是错误的是因为a是一个指针变量,指向的是一个地址,而5不是一个地址,除非你提前知道存放b的地址
取内容运算符改变了a存放地址指向的值,但是并未改变创建变量b时开辟空间的地址。测试发现只有新建另外一个指针变量才会改变这个指针变量的地址,至于为什么创建另外一个指针变量会改变这个指针变量的地址,欢迎大佬来补充
*/
printf("%d\n",*a);
//*作用为取内容运算符,获得指针变量a存放的地址里的内容。即5。
printf("%d\n",a);//输出a的地址,指针变量a永远输出地址
a=6422036;
//输出a的地址后知道了a的地址,copy来
printf("%d\n",*a);
//在输出*a,输出结果为2(b为2)。
int **c=&a;
//此时定义的也是一个指针变量 *c,*c存放的是创建指针变量a开辟空间时的地址
printf("%d\n",c);
/*
c存放的是创建指针变量*c开辟空间时的地址。即本身的地址,可等价于int c;int *c=&c.个人理解可能不对,欢迎思索后纠正
*/
printf("%d\n",*c);//*c存放的是指针变量a的地址
printf("%d",**c);
/*
*解引用,即输出*c里的内容,即输出指针变量a的地址(存放的是变量b的地址)的值
*/
/*
而*&属于c++里面的指针引用,关于指针引用,网上找半天也没找到太好的解释,欢迎各位补充
//指针,此时是无效的
void test1(Point *p)
{
p = new Point();
p->x = 100;
}
//指针引用,此时是有效的
void test2(Point *&p)
{
p = new Point();
p->x = 100;
}
*/
return 0;
}
上述代码的结果输出如下(耐心对照看下,会理解更透彻):
![](https://img-blog.csdnimg.cn/img_convert/dc60d3671e8a97f6b44ee2b383d3a194.png)