日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言中函数调用中的传值与传址

發布時間:2024/9/27 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言中函数调用中的传值与传址 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先介紹一下函數中傳值與傳址的概念:

  • 傳值:傳值,實際是把實參的值賦值給行參,相當于copy。那么對行參的修改,不會影響實參的值 。
  • 傳址: 實際是傳值的一種特殊方式,只是他傳遞的是地址,不是普通的賦值,那么傳地址以后,實參和行參都指向同一個對象,因此對形參的修改會影響到實參。
  • 下來用兩個例子來說明:

    先看看這個代碼

    #include<stdio.h>void swap(int n1,int n2) {int temp;temp=n1;n1=n2;n2=temp; }int main() {int a=10;int b=20;printf("a=%d\n",a);printf("b=%d\n",b);swap(a,b);printf("a=%d\n",a);printf("b=%d\n",b); }

    以上代碼實現的功能好像是交換兩個數的數值對吧!運行一下看看結果:

    不對啊,和我們預想的不一樣啊,可以看到a,b的值并沒有被交換,怎么回事呢?
    因為a和b雖然成功把值傳給了n1、n2,n1、n2也完成了它們之間數值的交換,但是也僅僅是n1、n2之間交換了,和a、b沒有關系。這是一次單向的傳遞過程,a、b能傳給n1、n2,n1、n2能成功互換其數值,但n1、n2是定義在函數swap中的局部變量,當函數調用結束后,它倆就over了,被殘忍拋棄了(子函數的生命期為子函數開始調用到結束調用,調用結束后就主動釋放了),因此它們沒有渠道把交換的值傳回給a、b。所以看到的是如上圖的結果。

    有了以上的結果,我們再來看這樣一段代碼:

    #include<stdio.h>void swap(int *p1,int *p2) {int temp;temp=*p1;*p1=*p2;*p2=temp; }int main() {int a=10;int b=20;printf("交換前a,b的值分別為:\n");printf("a=%d\n",a);printf("b=%d\n",b);swap(&a,&b);printf("交換后a,b的值分別為:\n");printf("a=%d\n",a);printf("b=%d\n",b); }

    以上代碼的功能同樣是實現交換兩個數的數值對吧!讓我們再來看看運行結果:

    很奇怪,為什么這兒卻能交換了?調試一下看看有什么玄機:



    這是調用swap函數前a、b的數值與其在內存中開辟的空間的地址以及調用函數后時*p1、*p2的數值與其地址。


    這是調用swap函數后a、b的數值與其在內存中開辟的空間的地址以及開始調用函數時*p1、*p2的數值與其地址。
    可以看到此時a、b與*p、*p2的地址空間是一樣的,那么當*p1、*p2被修改時,a、b也會跟著發生變化,因為此時二者占用了同一塊空間,當任意一者使空間里的內容發生變化時,二者都會做相同變化。
    舉個不太恰當的例子,把夫妻二人各看做一個變量,把它們的共用的銀行卡看做它們占用的同一塊空間,此時,他倆擁有的財產是一樣的,都是銀行卡里的錢,那么,不管誰花了或存了錢,他兩的財產都會發生同等改變,任意一人對財產的修改會影響到另一個人的財產。(當然,私房錢不算)。仔細想想,其實大概就是這么個道理。

    函數調用的傳值與傳址大概就是這么個過程,這快內容其實不難理解,只要知道其概念,通過實驗驗證,很容易掌握。

    總結

    以上是生活随笔為你收集整理的C语言中函数调用中的传值与传址的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。