C語言值傳遞和地址傳遞詳解

一. 值傳遞

我們舉一個例子:

寫一個函數找出兩個整數中的最大值。

#include<stdio.h>

//get_max函數
int get_max(int x,int y)
{
  return (x>y)?x:y;
}

int main()
{
  int num1 = 10;
  int num2 = 20;
  int max = get_max(num1,num2);
  printf("max = %d\n",max);
  return 0;
}

運行結果是:

max = 20

我們來分析一下這個函數調用過程:

num1,num2作為實參傳入get_max()函數,形參x,y被實例化(分配內存單元),num1和num2的值按照函數形參表順序對應地傳給瞭x和y,也就是x=10,y=20,然後函數將x和y中較大的一個的值返回。函數調用完畢,x和y被自動銷毀。

我們看一下函數的特征,如果函數的形參和實參一致,這就是值傳遞。

二.地址傳遞

再舉一個例子:

寫一個函數交換兩個整形變量的內容。

很多初學者一看覺得太簡單瞭,按照值傳遞我們來寫一遍。

#include <stdio.h>
//值傳遞
void Swap1(int x, int y) {
    int tmp = 0;
    tmp = x; 
    x = y; 
    y = tmp; 
}
int main()
{
	int num1 = 1;
	int num2 = 2;
	
  printf("交換前::num1 = %d num2 = %d\n",num1,num2);
  Swap1(num1, num2);
	printf("swap1::num1 = %d num2 = %d\n", num1, num2);
	return 0; 
}

但此時的結果是什麼呢?

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-SPPXxlHu-1642493097747)(../source/images/image-20220118152647618.png)]

num1,num2值並沒有變啊,並沒有交換啊,為什麼呢?

因為當實參傳給形參的時候,形參是實參的一份臨時拷貝,對形參的修改不會影響實參

我們來打印一下各變量的地址

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-AnfGU4Nm-1642493097749)(../source/images/image-20220118153528486.png)]

可以看到,實參有自己的地址,形參也有自己的地址,實參隻把自己的值傳給瞭形參,地址各有各的,實參的地址上放的值並沒有變啊,並且形參在函數調用完後就自動銷毀瞭,也就是說函數內與函數外的變量並沒有建立真正的實質的聯系。就想象你copy瞭一個自己的仿生人,他吃瞭東西,進你的胃瞭嗎?肯定他吃他飽,跟你毫無相關是吧(狗頭

那麼這個問題怎麼解決呢?地址傳遞

#include <stdio.h>
//值傳遞
void Swap1(int x, int y) {
    int tmp = 0;
    tmp = x; 
    x = y; 
    y = tmp; 
}
int main()
{
	int num1 = 1;
	int num2 = 2;
	
  printf("交換前::num1 = %d num2 = %d\n",num1,num2);
  Swap1(num1, num2);
	printf("swap1::num1 = %d num2 = %d\n", num1, num2);
	return 0; 
}

​ 我們來看一下結果

在這裡插入圖片描述

地址傳遞做瞭什麼?

做地址傳遞時 函數參數是指針變量,指針變量裡面裝著的就是地址嘛,所以實參直接就把自己的地址傳過去瞭,px裡放的num1地址,py裡放的num2地址, *px就是num1本身, *py就是num2本身,實參本身進行瞭賦值交換,這次不是你的仿生人瞭,就是你自己體驗人生。

我們看一下函數特征:如果傳入的實參是形參的指針,那就是地址傳遞。

其實有一個問題我好久才想明白:

為什麼上一個例子(返回兩數中較大的一個)沒有用地址傳遞也成功瞭呢?這兩種方式使用的界限是什麼呢?

後來這個疑問終於被解答瞭:

因為第一個例子裡num1,num2的值並不需要改變,函數中x,y比較後如果返回x,x的值和a的值是一樣的,這個對結果是不影響的,也就是說,這種問題不需要改變實參的值,形參和實參不需要建立那麼實質的聯系

但要搞清楚的是,函數返回的是num1本身嗎?是num1地址上的值嗎?不,隻是num1的拷貝x地址上的值。

綜上,在需要改變實參的值時一定要使用地址傳遞才行。

總結

到此這篇關於C語言值傳遞和地址傳遞詳解的文章就介紹到這瞭,更多相關C語言值傳遞 地址傳遞內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: