c语言中关于&和*的区别的一点小结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zlyaxixuexi/article/details/51868787

首先先大概明确下&和*的含义

&:取地址符,用来获取一个对象的地址。

int a;

scanf(“%d”,&a);//a的内存地址,把键盘输入的整形数据存在int型变量a中。

printf("%d",&a);//获取a的地址,并输出

注:在C++中,&还有引用的意思。粗浅的说,同一块内存单元有不同的指针

*:定义指针变量,即指向内存单元的指针,用来获取指针指向的变量的值.

 int* a;//定义一个int型指针

b=*a;//获取*a的所指向的变量的值

必须注意,*和&出现在声明语句和执行语句中的含义是不同的。

然后通过我们最为数值的数据交换的三个例子来看他们的区别

#include "stdio.h"

/*引用xy的地址,虽然传递的是xy的值,但函数获取x和y的地址,改变其地址存储的数据,但ab所指的内存块仍未改变*/

void swap1(int &a,int &b)

{

int temp=a;

a=b;

b=temp;

printf("%d %d\n",&a,&b);

}

/*传递的是mn的地址,更改了mn所指内存块的数据*/

void swap2(int* a, int* b)

{

int temp=*a;

*a=*b;

*b=temp;

printf("%d %d\n",a,b);

}

/*传递的是pq的地址,a指向了pb指向了q,但是经过交换后,a指向了qb指向了ppq所指的内存块的数据并未改变*/

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

无论函数的参数传递的是值还是指针,其指针地址的值都未发生改变,改变的只是指针所指的内存块存储的数据。



猜你喜欢

转载自blog.csdn.net/zlyaxixuexi/article/details/51868787