本文目錄一覽:
關於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