【C語言】關於子函數調用的指針傳遞和解引用問題

首先以一段示例代碼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函數便得知:其中使用了函數的解引用,由此將值傳給主函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章