首先以一段示例代碼begin:
#include<stdio.h>
void Swap(int a,int b)
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 1;
int b = 2;
Swap(a, b);
printf("%d\n%d\n", a, b);
return 0;
}
函數運行之後,顯示如圖所示,沒有實現函數的功能:將a,b的值進行交換。
由此可知子函數的作用只是將形式參數進行交換,並沒有改變實參的值。因此,主函數調用子函數需要進行指針傳參,這樣才能改變實參的內容。
同樣的有這樣一段程序:
#include<stdio.h>
void Swap(int *p1,int *p2)
{
int *tmp= p1;
p1 = p2;
p2 = tmp;
}
int main()
{
int a = 1;
int b = 2;
Swap(&a, &b);
printf("%d\n%d\n", a, b);
return 0;
}
函數運行之後,實參的值依然沒有改變,可見指針p1,p2分別保存了a,b的地址,指向a,b;此程序只交換了p1,p2保存的值,沒有改變a,b的值。
我們在編碼的時候還會出現如下情況:
#include<stdio.h>
void Swap(int *p1,int *p2)
{
int *tmp;
*tmp = *p1;
*p1 = *p2;
*p2 = *tmp;
}
int main()
{
int a = 1;
int b = 2;
Swap(&a, &b);
printf("%d\n%d\n", a, b);
return 0;
}
編譯器會報錯,導致此現象的出現是因爲未初始化,int* tmp爲一個隨機值,導致沒有訪問權限,故被稱爲野指針(沒有訪問權限的指針,又稱爲懸掛指針)。
最後給出一段正確的子函數調用程序:
#include<stdio.h>
void Swap(int *p1,int *p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
int main()
{
int a = 1;
int b = 2;
Swap(&a, &b);
printf("%d\n%d\n", a, b);
return 0;
}
定義一個臨時變量,作爲交換的中轉站,傳參使用指針,再進行解引用就可以將a,b的值進行交換了。
通過以上的例子得出:子函數如果要影響父函數必須進行傳指針和解引用倆個步驟。
關於子函數影響父函數還可以通過以下例子說明:
#include<stdio.h>
bool IsExist(char elem[], char key, char *rtval)
{
for (int i = 0; elem[i] != '\0'; i++)
{
if (key == elem[i])
{
return true;
}
*rtval = key;
}
}
int main()
{
char arr[] = "hello world!";
char key = 'd';
char* p = &key;
printf("%d\n", Get(arr, key, p)); //若爲真,打印1;若爲假,打印0。
printf("%d\n", *p); // ‘d’ 的ASCII碼爲100
return 0;
}
以上函數運行之後的結果爲:
仔細看返回的是倆個值哦!看看IsExist函數便得知:其中使用了函數的解引用,由此將值傳給主函數。