先来看一段代码吧
int a=10;//a为int类型
int *p;//p为int *类型
//p中存放的是int类型变量的地址,p指向一个int类型的变量
*p=a;
printf("a=%d\n",a);
printf("*p=%d\n",*p);
printf("&a=%x\n",&a);
printf("p=%x\n",p);
printf("&p=%x\n",&p);
运行结果:
a=10
*p=10
&a=6ff748
p=6ff748
&p=6ff73c
int a=10;//为a变量申请一个内存,地址为6ff748,并在这个地址的内存中存放10。
int *p;//给指针p变量申请一个内存,地址为6ff73c,变量p存放的内存为NULL(空)。
p=&a;//将变量a的地址赋值给指针p所存放的内容。p中存放的是6ff748。
下面的图,可以帮助我们理解:
a存放的内容的值: 10, a 自己所在的地址: 6ff748
p 存放的地址的值: 6ff748; p 自己所在的地址: 6ff73c;
p 存放的地址所指所存放内容的值: 3
(*p)操作是这样一种运算,返回p 的值作为地址的那个空间的取值。
(&p)则是这样一种运算,返回当时声明p 时开辟的地址。
通俗的讲*表示取值,&表示取地址
所以在上面的代码中:
&a=6ff748 p=6ff748
*p=10 &p=6ff73c
*&a=10 *&p=6ff748
**&p=10
通过指针来修改变量的值:
int a=10;
int* p=&a;
printf("%d\n",a);
*p=2;
printf("%d\n",a);
运行结果:
10
2
这是在main函数中进行的。
接下来看一段段代码
void swap1(int x,int y)
{
int t;
t=x;x=y;y=t;
}
void swap2(int* p,int* q)
{
int t;
t=*p;*p=*q;*q=t;
}
int main()
{
int a=10;
int b=5;
printf("%d,%d\n",a,b);
swap1(a,b);
printf("%d,%d\n",a,b);
swap2(&a,&b);
printf("%d,%d\n",a,b);
return 0;
}
运行结果:
10,5
10,5
5,10
二者都是交换两个变量的值
但是swap1没有交换成功,而swap2交换成功了。
由于在调用swap1时,只是将a,b的值给了x,y。所以在swap1中,实际上只交换了x,y的值。swap1也无法访问mian函数中的变量,只是将main函数中的值复制下来,然后对复制体进行操作而不是对本体进行操作而且swap1函数在结束时,swap1中的局部变量又被销毁了。
但是在调用swap2函数:
在调用时进行第一步p指向a,q指向b;第二步t=*p;//(t=10);第三步*p=*q(把p指向的a中的内容改为5);第四步*q=t(把q指向的b中的内容改为5)