C语言 指针

先来看一段代码吧

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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值