指针和地址的疑惑


前段时间做数据结构实验时,想到了一个之前一直没有想过的问题,创建动态链表时总有一句:p2=p1;p1=malloc;即把p1的值(一个地址)传递给p2,然后p1指向一个新的地址,这时候我产生了疑惑:p1和p2都是存放地址的,那把p1的地址赋给p2,p1就和p2有了同一个地址,可这样p1之后指向新节点时,p2不也跟着p1一起变了吗?那么之前的p1要怎么保存?经过上网查询和咨询室友,大致弄懂了这些,现以三个例子进行说明:

1

#include<stdio.h>
int main()
{
	int m,n;
	int *p,*k;
	m=5;
	n=6;
	p=&m;
	k=&n;
	printf("%d\n",*p);

	printf("%d\n",*k);
		printf("%d\n",p);
	*p=*k;
	
		printf("%d\n",p);
	printf("%d\n",*p);

	printf("%d\n",*k);
	printf("%d",m);
	getchar();
	getchar();
	return 0;
	
 } 

p=&m,k=&n之后,相当于p和m,k和n绑定了,之后无论是m变化还是*p变化,都会引起对方的变化,例如此题,第一次输出*k和*p,自然是5和6,此时p是m的地址,k是n的地址,之后进行*p=*k,此时p还是m的地址,只不过*p也就是m的值已经被替换成6了,自然输出m也就变成了6。此例子在于说明指针地址不变,但是指针指向的值改变了。

2

#include<stdio.h>
int main()
{
	int m;
	int *p;
	m=5;
	p=&m;
	printf("%d\n",*p);
	m=7;
	printf("%d\n",*p);
	getchar();
	getchar();
	return 0;
}

这个例子在于p=&m,之后p和m就绑定了,p永远是m的地址,所以无论m的值怎么改变,只要p中还是m的地址,就可以找到m,也就可以通过*p找到m变量的值。

3

#include<stdio.h>
int main()
{
	int m,n;
	int *p,*k;
	m=5;
	p=&m;
	k=p;
	printf("%d\n",*k);
	n=7;
	p=&n;
	printf("%d\n",*p);
	printf("%d\n",*k);
	getchar();
	getchar();
	return 0;
}

此例在于说明p=&m之后,p和m绑定,之后k=p,就把p(即m的地址)传递给了k,此时p和k相同,若是将n=7换成m=7,并且把p=&n删去,则该程序和上一个程序想要表达的意思相同,但若是按照此程序,由于之后又有n=7,以及p=&n,即p指向了新的地址(n的地址.),则k保留之前的p,不再随着p一起变化,这就回到开始的那个问题,因为p2=p1之后,p1指向了一个新地址,所以p1和p2的联系断了,类似于变量之间的赋值,把值赋给另一个变量之后,此变量再如何做变化都和被赋值变量没有关系了。

 


 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值