1. 程式人生 > >指標和地址的疑惑

指標和地址的疑惑


前段時間做資料結構實驗時,想到了一個之前一直沒有想過的問題,建立動態連結串列時總有一句: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的聯絡斷了,類似於變數之間的賦值,把值賦給另一個變數之後,此變數再如何做變化都和被賦值變數沒有關係了。