欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2022年01月19日 09:01:35   作者:At3uki  
大家好,本篇文章主要講的是C語言值傳遞和地址傳遞詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽

一. 值傳遞

我們舉一個(gè)例子:

寫一個(gè)函數(shù)找出兩個(gè)整數(shù)中的最大值。

#include<stdio.h>

//get_max函數(shù)
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;
}

運(yùn)行結(jié)果是:

max = 20

我們來分析一下這個(gè)函數(shù)調(diào)用過程:

num1,num2作為實(shí)參傳入get_max()函數(shù),形參x,y被實(shí)例化(分配內(nèi)存單元),num1和num2的值按照函數(shù)形參表順序?qū)?yīng)地傳給了x和y,也就是x=10,y=20,然后函數(shù)將x和y中較大的一個(gè)的值返回。函數(shù)調(diào)用完畢,x和y被自動(dòng)銷毀。

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

二.地址傳遞

再舉一個(gè)例子:

寫一個(gè)函數(shù)交換兩個(gè)整形變量的內(nèi)容。

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

#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; 
}

但此時(shí)的結(jié)果是什么呢?

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

num1,num2值并沒有變啊,并沒有交換啊,為什么呢?

因?yàn)?strong>當(dāng)實(shí)參傳給形參的時(shí)候,形參是實(shí)參的一份臨時(shí)拷貝,對(duì)形參的修改不會(huì)影響實(shí)參

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

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

可以看到,實(shí)參有自己的地址,形參也有自己的地址,實(shí)參只把自己的值傳給了形參,地址各有各的,實(shí)參的地址上放的值并沒有變啊,并且形參在函數(shù)調(diào)用完后就自動(dòng)銷毀了,也就是說函數(shù)內(nèi)與函數(shù)外的變量并沒有建立真正的實(shí)質(zhì)的聯(lián)系。就想象你copy了一個(gè)自己的仿生人,他吃了東西,進(jìn)你的胃了嗎?肯定他吃他飽,跟你毫無相關(guān)是吧(狗頭

那么這個(gè)問題怎么解決呢?地址傳遞

#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; 
}

? 我們來看一下結(jié)果

在這里插入圖片描述

地址傳遞做了什么?

做地址傳遞時(shí) 函數(shù)參數(shù)是指針變量,指針變量里面裝著的就是地址嘛,所以實(shí)參直接就把自己的地址傳過去了,px里放的num1地址,py里放的num2地址, *px就是num1本身, *py就是num2本身,實(shí)參本身進(jìn)行了賦值交換,這次不是你的仿生人了,就是你自己體驗(yàn)人生。

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

其實(shí)有一個(gè)問題我好久才想明白:

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

后來這個(gè)疑問終于被解答了:

因?yàn)榈谝粋€(gè)例子里num1,num2的值并不需要改變,函數(shù)中x,y比較后如果返回x,x的值和a的值是一樣的,這個(gè)對(duì)結(jié)果是不影響的,也就是說,這種問題不需要改變實(shí)參的值,形參和實(shí)參不需要建立那么實(shí)質(zhì)的聯(lián)系

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

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

總結(jié)

到此這篇關(guān)于C語言值傳遞和地址傳遞詳解的文章就介紹到這了,更多相關(guān)C語言值傳遞 地址傳遞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言由淺入深理解指針

    C語言由淺入深理解指針

    C語言這門課程在計(jì)算機(jī)的基礎(chǔ)教學(xué)中一直占有比較重要的地位,然而要想突破C語言的學(xué)習(xí),對(duì)指針的掌握是非常重要的,本文將具體針對(duì)指針的基礎(chǔ)做詳盡的介紹
    2022-05-05
  • c++ 排查內(nèi)存泄漏的妙招

    c++ 排查內(nèi)存泄漏的妙招

    這篇文章主要介紹了c++ 如何用輔助類排查內(nèi)存泄漏,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-03-03
  • C++實(shí)現(xiàn)LeetCode(145.二叉樹的后序遍歷)

    C++實(shí)現(xiàn)LeetCode(145.二叉樹的后序遍歷)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(145.二叉樹的后序遍歷),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 深入淺析C++中的#,##,和

    深入淺析C++中的#,##,和

    這篇文章主要介紹了C++中的#,##,和"的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • C語言實(shí)現(xiàn)學(xué)生個(gè)人消費(fèi)管理系統(tǒng)

    C語言實(shí)現(xiàn)學(xué)生個(gè)人消費(fèi)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言學(xué)生個(gè)人消費(fèi)管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++判斷一個(gè)點(diǎn)是否在圓內(nèi)的方法

    C++判斷一個(gè)點(diǎn)是否在圓內(nèi)的方法

    這篇文章主要為大家詳細(xì)介紹了C++判斷一個(gè)點(diǎn)是否在圓內(nèi)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Socket通信原理和實(shí)踐

    Socket通信原理和實(shí)踐

    本文詳細(xì)講解了Socket通信原理和實(shí)踐,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • linux下C語言中的mkdir函數(shù)與rmdir函數(shù)

    linux下C語言中的mkdir函數(shù)與rmdir函數(shù)

    以下是對(duì)C語言中的mkdir函數(shù)與rmdir函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • C++代碼實(shí)現(xiàn)鏈隊(duì)列詳解

    C++代碼實(shí)現(xiàn)鏈隊(duì)列詳解

    下面小編就為大家分享一篇C++代碼實(shí)現(xiàn)鏈隊(duì)列的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧,希望能夠給你帶來幫助
    2021-09-09
  • C++位圖的實(shí)現(xiàn)原理與方法

    C++位圖的實(shí)現(xiàn)原理與方法

    位圖(bitset)是一種常用的數(shù)據(jù)結(jié)構(gòu),常用在給一個(gè)很大范圍的數(shù),判斷其中的一個(gè)數(shù)是不是在其中。這篇文章主要給大家介紹了關(guān)于C++位圖以及位圖的實(shí)現(xiàn)原理與方法,需要的朋友可以參考下
    2021-05-05

最新評(píng)論