c語言傳參傳地址,c語言傳遞地址

本文目錄一覽:

關於c語言形參實參傳地址傳數值的問題

C語言中函數的參數傳遞(值傳遞,地址傳遞,引用傳遞)

/* ^_^ 2015年11月3日09:58:03 辨析 C語言中函數的參數傳遞*/

//值傳遞 其實質是將數值傳遞給其他倆個變量,自己變量裡面的值並沒有改變—-所以說是值傳遞。

# include stdio.h

void exchange();

int main (void)

{

int x,y;

x=3;

y=4;

exchange(x,y); //這就是典型的值傳遞,它把X,Y的值傳遞給變a和b;

printf(“%d %d\n”,x,y); //a,b的值進行交換,但是變量X,Y裡面的值並沒有交換。

return 0;

}

void exchange(int a,int b)

{

int temp;

temp =a;

a=b;

b=temp;

printf(“%d %d\n”,a,b);

}

//地址傳遞 (提到地址二字,應該始終明確,C語言中的地址是基於指針的,所以地址傳遞是一定會用指針的)

# include stdio.h

void exchange();

int main (void)

{

int x,y;

x=3;

y=4;

exchange(x,y); //這就是典型的地址傳遞,它把X,Y變量地址傳遞給指針a和b;

printf(“%d %d\n”,x,y); //*a,*b的值進行交換,就是找到a,b對應的地址交換地址裡面的值,其實也就是

//找到 a,b值進行交換。

return 0;

}

void exchange(int *a,int*b)

{

int temp;

temp =*a;

*a=*b;

*b=temp;

printf(“%d %d\n”,*a,*b);

}

c語言傳值和傳地址

輸出:

調用函數前輸出結果:

nums[1]=0

nums[2]=0

nums[3]=0

nums[4]=0

value = 0

因為循環變量初值是1,所以nums[0]不會輸出

findMax(nums,value); //調用findMax,vals指向nums開始元素,m=0

i=1;[i=1],iMAXELS成立,開始循環,vals[i]=1,nums[0,1,0,0,0],輸出:vals[1]=1

i++;[i=2],iMAXELS成立,繼續循環,vals[i]=1,nums[0,1,1,0,0],輸出:vals[2]=1

i++;[i=3],i5成立,繼續循環,vals[i]=1,nums[0,1,1,1,0],輸出:vals[3]=1

i++;[i=4],i5成立,繼續循環,vals[i]=1,nums[0,1,1,1,1],輸出:vals[4]=1

i++;[i=5],i5不成立,結束循環,輸出:m=1

函數返回,m被捨棄,輸出:

調用函數後輸出結果:

nums[1]=1

nums[2]=1

nums[3]=1

nums[4]=1

value = 0

由於子程序中沒有計算過m,所以m值一直是初始的1,這個m是函數自己臨時定義的變量,用來接收調用者傳進來的參數,main函數將vale的值0傳遞給m,計算完後,函數返回,m被捨棄,不會影響value的值(作為參數,是取value的值來用一下,然後就沒有value的事了)

如果想將m的值返回,那麼有兩種辦法:

函數寫成:void findMax(int vals[],int *m),然後函數中用到m的地方都改成*m,調用時findMax(nums,value);

函數寫成:int findMax(int vals[],int m),函數最後寫return m;調用時value=findMax(nums,value);

  如果子程序不需要value作為m的初始值,則可省略第2個參數:int findMax(int vals[]),調用:value=findMax(nums);

c語言 傳值和傳地址

c語言中數組的實質就是指針,所以函數的參數是數組的話,就是傳入了一個指針,也就是傳入了一個地址。

主函數向findMax中傳了兩個參數,vals是傳地址,m是傳值,所以在findMax函數中,對vals做的改變可以帶回到主函數,而對m的賦值卻對主函數中的變量value沒有任何影響

關於c語言的傳值和傳地址

編程中,很多東西要你自己去摸索,才能真正的理解。關於地址與值的問題,其實你自己可以試,把變量的地址輸出來看看看是不是一樣,比如 printf(“%x”,a); 這樣就是以把變量a的地址用16進制的方式輸出來,看看地址到底是怎麼一回事。

傳值與傳地址可以這樣理解:

就像我把我寫的作文抄了一份給你,你拿去看了之後把有的地方改了,現在我要交作文,而我有一份,所以我直接交了,我交的作文內容並沒有變,這就是傳值,即值傳遞。

同理,如果我把我的作文直接給你,你看了後也把有些地方改了,現在我也要交,你只能還給我,我再交,這時我交的就是被你改過的了,這就是傳地址,即引用傳遞。

這只是我的理解,有誤的地方還請指正。

C語言數組的地址傳遞和值傳遞

1.值傳遞就不寫了,顧名思義就是把當前的值傳到下一個函數中,變量本身的沒有發生任何變化

2.指針傳遞,把當前變量指針傳到下一個函數,在另外函數裡邊修改指針的值會修改當前變量值

#include stdio.h

  void func(int *p){

                *p = 9;

                return;

    }

void swap(int *a, int *b){ //交換兩個變量的值

        int temp = *a;

        *a = *b;

        *b = temp;

}

int main(void){

            int a = 0;

            func(a); //要修改一個變量,把他的地址傳過去

            printf(“%d”,a);//9

            int b = 3;int c = 4;

            swap(b,c);

            return 0;

}

C語言傳值傳址的問題

首先是C語言的參數傳遞機制,比如下面這樣的一個簡單函數

int plus(int a,int b){

    return a+b;

}

//..

//其它函數中調用

z=plus(x,y);

這個函數調用的過程中會進行參數拷貝,也就是說上述代碼會被編譯成大致如下的樣子(以下為偽代碼)

int plus{

int a;int b;//函數的參數也是函數的內部變量

return a+b;

}

//…

//其它函數中調用

plus:a=x;//先將參數的值複製給被調用函數內部的參數

plus:b=y;//同上

z=plus()//執行函數

注意到上述過程中,所有函數的參數都是“複製”進去的,也就是說函數內部看見的參數並不是外部傳入的參數本身,而是其副本,對副本進行操作(如交換)會失敗,因為這些操作無法影響到外部的參數本身。

但如果使用指針傳參,例如

void fun(int*a,int*b)//順帶一提,返回值一定要養成習慣寫上

{int c;c=*a,*a=*b,*b=c}

//…

fun(x,y)

在編譯的時候同樣遵循參數複製原則,變成如下代碼(以下為偽代碼)

fun

{

int* a;int* b;//參數a,b仍然是函數的內部變量,不過其類型是int*

int c;c=*a,*a=*b,*b=c

}

//…

fun:a=x;//將x的地址複製給a

fun:b=y;//同上

fun();.//執行函數

可以看到,參數仍然是“複製”進去的,但要注意,傳入的參數x與其參數副本a雖然是兩個東西,但他們是指針,存儲的地址一樣,也就是指向的對象時一樣的(都是x),y與b同理,因此在函數內部通過指針a,b尋址就可以訪問函數外部的變量x,y,並對其進行交換操作

原創文章,作者:WHZT,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/135580.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
WHZT的頭像WHZT
上一篇 2024-10-04 00:13
下一篇 2024-10-04 00:13

相關推薦

  • cmd看地址

    本文將從多個方面詳細闡述cmd看地址,包括如何查看本機IP地址、如何查看路由器IP、如何查看DNS服務器IP等等。 一、查看本機IP地址 要查看本機IP地址,首先需要打開cmd窗口…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • 尚硅谷官網地址用法介紹

    尚硅谷是國內一家領先的技術培訓機構,提供了眾多IT職業的培訓,包括Java、Python、大數據、前端、人工智能等方向。其官網地址為http://www.atguigu.com/。…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28

發表回復

登錄後才能評論