下面通过交换两个数的值的例子比较,程序代码在最下面,加深对指针变量的理解
-
swap1函数
-
①main主函数a的值3,b的值5传递到是swap1,
swap1的局部变量p, q虽然在做值3和5 的交换,
可是一旦交换完毕,局部变量p和q所占用的内存空间会释放掉。 - ②主函数main中的a, b仍然没有被改变。 swap2函数
-
①main函数中a和b的地址分别传递给p, q.
swap2做的是两个地址值的传递,被新赋给的两个地址值交换,
但是无法将main程序中a的地址更换为b的地址,
b的地址更换为a的地址。任何程序都无法做到 - ②所以a的值没有变,b的值没有变 swap3函数
-
①main函数中a和b的地址分别传递给p, q.
此时*p将完全相当于a, 因为p的地址是a的内存地址,
*在这里是&的你运算,这样*q就完全等同与b
在swap3中交换*p和*q就完全等同于交换main函数中的a和b.
①一旦一个指针变量被赋予了某个普通变量的内存地址,指针变量就指向了这个普通变量
②这个指针变量指向了这个普通变量,则修改指针变量,不影响该普通变量
同样这个时候修改普通变量也不影响指针变量。
③*指针变量完全等同于该普通变量。
④另外需要说明的是变量的本质就是内存
⑤普通变量(相对与指针变量而言,即非指针变量)一旦被定义,其内存地址无法被改变,如main函数中的a, b
交换变量值的经典程序
#include <stdio.h>
void swap1(int p, int q)
{
int t;
t = p;
p = q;
q = t;
return;
}
void swap2(int * p, int * q)
{
int * t;
t = p;
p = q;
q = t;
return;
}
void swap3(int * p, int * q)
{
int t;
t = *p;
*p = *q;
*q = t;
return;
}
int main()
{
int a = 3;
int b = 5;
printf("==========The first call swap1============\n");
printf("before swap1(a, b), a = %d, b = %d\n", a, b);
swap1(a, b);
printf("after swap1(a, b), a = %d, b = %d\n", a, b);
printf("==========The second call swap2===========\n");
printf("before swap1(&a, &b), a = %d, b = %d\n", a, b);
swap2(&a, &b);
printf("after swap1(&a, &b), a = %d, b = %d\n", a, b);
printf("==========The third call swap3============\n");
printf("before swap3(&a, &b), a = %d, b = %d\n", a, b);
swap3(&a, &b);
printf("after swap3(&a, &b), a = %d, b = %d\n", a, b);
return 0;
}