首先先大概明确下&和*的含义
&:取地址符,用来获取一个对象的地址。
int a;
scanf(“%d”,&a);//取a的内存地址,把键盘输入的整形数据存在int型变量a中。
printf("%d",&a);//获取a的地址,并输出
注:在C++中,&还有引用的意思。粗浅的说,同一块内存单元有不同的指针
*:定义指针变量,即指向内存单元的指针,用来获取指针指向的变量的值.
int* a;//定义一个int型指针
b=*a;//获取*a的所指向的变量的值
必须注意,*和&出现在声明语句和执行语句中的含义是不同的。
然后通过我们最为数值的数据交换的三个例子来看他们的区别。
#include "stdio.h"
/*引用x和y的地址,虽然传递的是x和y的值,但函数获取x和y的地址,改变其地址存储的数据,但a和b所指的内存块仍未改变*/
void swap1(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
printf("%d %d\n",&a,&b);
}
/*传递的是m和n的地址,更改了m和n所指内存块的数据*/
void swap2(int* a, int* b)
{
int temp=*a;
*a=*b;
*b=temp;
printf("%d %d\n",a,b);
}
/*传递的是p和q的地址,a指向了p,b指向了q,但是经过交换后,a指向了q,b指向了p,p和q所指的内存块的数据并未改变*/
void swap3(int* a, int* b)
{
printf("%d %d\n",a,b);
int temp=*a;
a=b;
b=&temp;
printf("%d %d\n",a,b);
printf("%d %d\n",*a,*b);
}
void main()
{
int x = 1,y = 2;
int m = 3,n = 4;
int p = 5,q = 6;
printf("x=%d y=%d m=%d n=%d p=%d q=%d \n",x,y,m,n,p,q);
printf("交换前x的地址%d y的地址%d\n",&x,&y);
swap1(x,y);
printf("交换后x的地址%d y的地址%d\n",&x,&y);
printf("交换前m的地址%d n的地址%d\n",&m,&n);
swap2(&m,&n);
printf("交换后m的地址%d n的地址%d\n",&m,&n);
printf("交换前p的地址%d q的地址%d\n",&p,&q);
swap3(&p,&q);
printf("交换后p的地址%d q的地址%d\n",&p,&q);
printf("x=%d y=%d m=%d n=%d p=%d q=%d \n",x,y,m,n,p,q);
}运行结果:
x=1 y=2 m=3 n=4 p=5 q=6
交换前x的地址1638204 y的地址1638200
1638204 1638200
交换后x的地址1638204 y的地址1638200
交换前m的地址1638196 n的地址1638192
1638196 1638192
交换后m的地址1638196 n的地址1638192
交换前p的地址1638188 q的地址1638184
1638188 1638184
1638184 1638088
6 5
交换后p的地址1638188 q的地址1638184
x=2 y=1 m=4 n=3 p=5 q=6
Press any key to continue
无论函数的参数传递的是值还是指针,其指针地址的值都未发生改变,改变的只是指针所指的内存块存储的数据。