1. 程式人生 > >C語言傳地址與傳值的區別

C語言傳地址與傳值的區別

 

    C語言中,函式的引數分為傳值與傳地址,下面程式碼為傳值函式:

   #include<stdio.h>

   void function(int x,int y)//實現兩個引數交換

   {

       int temp;

       temp=x;

       x=y;

       y=temp;

    }

   void main()

   {

      int a=1,b=2;

      function(a,b);

      printf("%d",a);

      printf("%d",b);

    }

    結果會輸出1和2,而不是2和1 也就是說這a和b並沒有交換。這是因為傳值函式傳遞的是引數的副本,也就是說函式複製了兩個變數,在記憶體中另外建立了兩個空間,這兩個記憶體空間的值分別與a和b的值相等,僅此而已,並沒有對a、b進行任何操作。所以a和b無任何變化,這就是傳值的函式。由此我們知道,傳值函式在執行時,會增加記憶體使用量。

    傳地址函式:

   #include<stdio.h>

   void function(int &x,int &y)//實現兩個引數交換

   {

       int temp;

       temp=x;

       x=y;

       y=temp;

    }

   void main()

   {

      int a=1,b=2;

      function(a,b);

      printf("%d",a);

      printf("%d",b);

    }

     上面的函式執行後,會輸出2和1.為什麼呢?實際上這個傳遞的是a和b本身,而不是副本。該函式也叫傳引用函式。所謂引用就是同一變數不同名字。例如

    a=2;b=3;

    &x=a;

    這時,a與x是同一塊空間的不同名字,如果再有以下語句

    x=b;這時x等於3,而a也是3 因為他們是同一塊儲存空間。就好像我叫水滸英雄林沖人稱豹子頭一樣,林沖 豹子頭都指的一個人。很顯然,傳地址(傳引用)沒有副本,就是針對變數本身,所以期函式內部對形參的改變會影響實參。由於不產生另外的儲存空間的佔用,所以,能用傳地址的儘量用傳地址。

   還有一種傳地址函式如下

    #include<stdio.h>

   void function1(int *x,int *y)//實現兩個引數交換

   {

       int *temp;

       *temp=*x;

       *x=*y;

       *y=*temp;

    }

   void function2(int *x,int *y)//實現兩個引數交換

   {

       int *temp;

       temp=x;

       x=y;

       y=temp;

    }

   void main()

   {

      int a=1,b=2;

      function1(&a,&b);

      //function2(&a,&b);

      printf("%d",a);

      printf("%d",b);

    }

   如果執行function2(),你會發現輸出結果依然沒有變化。這是由於函式建立的是指標的副本,交換的也是指標本身,也就是指向a和b的地址的副本,並不是實際的a和b變數,懂了吧。

至於function1()函式,這個我也沒有搞明白,希望網友指教。實際上機測試的結果是,在VC6.0測試,能編譯連線,但是執行的時候就會異常。

相關推薦

C語言地址區別

      C語言中,函式的引數分為傳值與傳地址,下面程式碼為傳值函式:    #include<stdio.h>    void function(int x,int y)//實現兩個引數交換    {        int temp;        temp

C語言中陣列指標的區別

本文是對《C語言深度剖析》一書內容的拓展,在看這本書的時候解了很多我之前的一些困惑,故在此記錄。對陣列的引用總是可以寫成對指標的引用,而且確實存在一種指標和陣列的定義完全相同的上下文環境。 但是指標和陣列還是在本質上是不一樣的。指標就是指標,指標變數在32位的系統下面是4B

c語言定義變數宣告的區別

定義是要為變數分配儲存空間,還可以在定義的時候為變數指定初始值。 所謂的定義就是(編譯器)建立一個物件,為這個物件分配一塊記憶體並給它取上一個名字,這個名字就是我們經常所說的變數名或物件名。但注意,這個名字一旦和這塊記憶體匹配起來(可以想象是這個名字嫁給了這塊空間,沒有要彩

c語言const關鍵字巨集的區別

這是因為和巨集比起來: 1. const修飾的是一個變數,所以會在程式碼編譯階段進行語法檢查。 而巨集只會在預編譯階段進行簡單的替換動作; 2. 使用const修飾的是一個變數,具有具體的資料型別,所以編譯器會進行型別檢查。 3. 可以保護被修飾的東西,防止意外的修改,增強程式的健壯性。 以常見的strcpy

c語言邏輯運算位運算區別

c語言中,邏輯運算與位運算很容易混淆,但是它們的功能是完全不同的。邏輯運算認為所有的非零的引數都為TRUE,引數0表示false,它們返回1或0. &&與||和&與|重要的區別是,如果第一個引數求值能確定表示式的結果,那麼邏輯運算子就不會對第二個引數

關於C語言的fprintffwrite使用區別

C語言把檔案看作一個字元(位元組)的序列,即由一個一個字元(位元組)的資料順序組成。根據資料的組織形式,可分為ASCII檔案和二進位制檔案。ASCII檔案又稱為文字(text)檔案,它的每個位元組放一個ASCII程式碼,代表一個字元。二進位制檔案是把記憶體中的資料按其

c語言:順序表參要是指針類型的才能改變順序表

過去的 oca 頭文件 def blog 文件中 data div log 想在頭文件中初始化順序表,在main函數只能傳參的時候傳的是(sqlList L),調用LocalElem(L,X)是報錯說沒有給L初始化. 原因:調用初始化的函數,傳過去的參數是sqlList L

散分+快來報名“C語言指針匯編內存地址(二)”公開課

公開 lan shuf target dsd blank dmg userinfo gin iR歡2kaq崖居止40攘http://www.docin.com/app/user/userinfo?userid=179252984 Qsgb5V1仗mchttp://t.doc

C語言malloc()函式calloc()函式的區別

推薦部落格: 推薦部落格:https://blog.csdn.net/ddcodingya/article/details/80452397   推薦部落格:https:https://blog.csdn.net/Hackbuteer1/article/d

[C語言]二維陣列參的格式(詳細+總結)

喜歡就為我點贊,評論加收藏。 轉載請標明出處[link]https://blog.csdn.net/qq_43868654/article/details/84641383 初遇二維陣列作函式引數,宛如自己化身為了大頭兒子。很頭大。 不禁大聲吶喊:該怎麼宣告定義,該怎麼呼叫,又該怎麼

C語言的#define關鍵字typedef的三點區別

兩者區別主要在於在三處不同 (1)與#define不同,typedef建立的符號名只受限於型別,不能用與值 #define N 10 //將10替換為N,ok #define M int //將int替換為M,ok typedef i

c語言==字元陣列字串,char的取範圍(1)

求char型別陣列的strlen長度 昨天老師給了一道題目 #include <stdio.h> #include "string.h" int main() { int i; char a[1000]; fo

C語言-函式指標函式名的區別

記得大學時老師曾說函式的函式名是函式的入口的指標,之前看block通過clang編譯生成的C程式碼發現很多函式指標,於是想了解函式指標與函式名有什麼區別?以及函式指標一般都有些什麼作用。函式指標與函式名的區別首先先定義一函式以及一個指向蓋函式的函式指標,並分別對他們進行呼叫。

c語言位運算子邏輯運算子的區別

&&、||是邏輯運算子,用於從左到右求表示式的真值。假設x=1;y=2;那麼x&&y=1;x||y=1; &、|是位運算子,是對x,y進行位運算,x,y取值如上,那麼有x&y=0;(x的二進位制表示為00,y的二進位制表示為1

C語言C語言的constC++的const區別

C++中,const預設使用內部連線.而C中使用外部連線.內連線:編譯器只對正被編譯的檔案建立儲存空間,別的檔案可以使用相同的表示符或全域性變數.C/C++中內連線使用static關鍵字指定.外連線:所有被編譯過的檔案建立一片單獨儲存空間.一旦空間被建立,聯結器必須解決對這片儲存空間的引用.全域性變數和函式使

C++ 拷貝建構函式函式的區別(很嚴謹和全面)

這裡我們用類String 來介紹這兩個函式: 拷貝建構函式是一種特殊建構函式,具有單個形參,該形參(常用const修飾)是對該類型別的引用。當定義一個新物件並用一個同類型的物件對它進行初始化時,將顯式使用拷貝建構函式。為啥形參必須是對該型別的引用呢?試

C語言參數傳遞(傳遞、地址傳遞)+二級指針

strong 才有 color 示意圖 mage 影響 -s include expr 參數傳遞 C語言參數傳遞一般分為:值傳遞和地址傳遞 (註意:C語言中沒有引用傳遞,C++才有引用傳遞,因為很多C語言環境是用C++編譯器編譯,使得C看起來支持引用傳遞,導致很多網上很

c語言==系統呼叫庫函式的區別(28)

系統呼叫與庫函式的區別? (1)庫函式是語言或應用程式的一部分,而系統呼叫是核心提供給應用程式的介面,屬於系統的一部分 (2)庫函式在使用者地址空間執行,系統呼叫是在核心地址空間執行,庫函式執行

C語言中打印返回

返回值 struct demo bsp %d return username har strdup demo: ----return :返回值------------------ int mosquitto_username

C++ 淺談 strlen sizeof的區別

數據 數組長度 eof out 其他 使用 c++ 區別 字符串數組 先舉個栗子: 字符串數組跟字符串指針,然後分別使用sizeof跟strlen看輸出結果。 char strA[] = "2017-7-19"; char *strB = "23333"; cout &