1. 程式人生 > >指標的學習總結2

指標的學習總結2

父函式呼叫子函式時,要想子函式能修改父函式中的內容,前提必須滿足兩步:1.傳指標;2.解引用。

現在通過交換兩個變數的數值來理解指標。

1.編寫第一個交換函式

如下

void Swap1(int a,int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;

}

int main()
{
int a = 10;
int b = 20;
printf("%d,%d\n",a,b);

Swap1(a,b);

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

return 0;
}
此時會出現a和b並沒有交換成功。


為什麼呢?因為這個時候主函式和swap1函式裡面的a、b不相同,從各自的地址不同可知。

2.編寫第二個交換函式

void Swap2(int *p1,int *p2)
{
int *tmp;
tmp = p1;
p1 = p2;
p2 = tmp;
}

int main()
{
int a = 10;
int b = 20;
printf("%d,%d\n",a,b);

Swap2(&a,&b);

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

return 0;
}

此時還是沒有成功,是因為什麼呢,傳指標到子函式去了,但是沒有解引用。

3.編寫第三個函式

void Swap3(int *p1,int *p2)
{
int *tmp ; // 野指標,懸掛指標:沒有指向有效的地址
*tmp = *p1;//崩潰
*p1 = *p2;
*p2 = *tmp;
}
此時會出現崩潰現象,是因為設定了野指標,野指標不知道其所存的地址可以不可以訪問,就直接訪問,肯定會引起崩潰。

4.編寫第四個函式 

void Swap(int *p1,int *p2)
{
int tmp = *p1;
*p1 = *p2 ;
*p2 = tmp;
}

這次成功了,a和b的值終於交換了,是因為一傳指標,二解引用,而且沒有野指標。