『壹』 嚴老師的數據結構(c語言)中,函數的參數顯示傳遞是什麼意思我剛剛學習這本書
1、通過函數的參數顯示傳遞:
A(int a)
{
a = a+2;
}
B(void)
{
int b = 3;
A(b);
}
在函數A中a作為一個參數傳入函數中進行運算,那麼a就可以算作是A的輸入,然後在程序內部a進行了運算後值變了,那麼運算後的a又算作是A函數的輸出。
2、通過全局變數隱式傳遞:
全局變數你應該知道吧,簡單點說就是作用域涵蓋整個程序的變數(當然要看具體情況)。
假設a為int型全局變數,初始值為1:int a = 1;
A()
{
a = a + 2;
}
B()
{
a = a + 3;
}
main()
{
A();
B();
A();
}
通過main函數我們可以看到,程序首先執行的是函數A,那麼執行完函數A後全局變數a的值由初始值1變成了3,然後又繼續執行函數B,注意此時函數B也是對a進行運算,那麼此時全局變數a成了B的輸入,運算後a的值為了6,此時a為B的輸出。那麼也就是說全局變數a在經過A函數的改變後作為一個輸入隱式的傳入了B函數,然後經過B函數的運算又算作是B的輸出。執行過B函數後程序又遇到了A函數,那麼此時經過B函數運算的a又作為A函數的一個輸入了。
『貳』 c語言「在調用函數時,主調函數通過參數向被調函數傳遞數據。」這句話怎麼理解
/*
*網路知道
*/
#include<STDIO.H>
voidprint(intnum)
{
printf("%d ",num);
}
voidchange(intnum)
{
num=15;
}
voidtrue_change(int*num)
{
*num=15;
}
intmain(void)
{
intnumber=10;
print(number);//利用函數傳值列印
change(number);//試圖通過函數改變值但是函數是傳值調用不會改變的
print(number);//觀察沒有改變
true_change(&number);//利用傳指針就可以改變
print(number);//果然更改了
return0;
}
你可以去讀讀《C專家編程》
『叄』 c語言中參數是什麼概念
函數的參數分為形參和實參兩種。
形參出現在函數定義中,在整個函數體內都可以使用,離開該函數則不能使用。實參出現在主調函數中,進入被調函數後,實參變數也不能使用。
形參和實參的功能是作數據傳送,發生函數調用時,主調函數把實參的值傳送給被調函數的形參從而實現主調函數向被調函數的數據傳送。
舉個例子:
定義一個函數s=f(a,b),功能是將a和b的差賦值給s,那麼,a和b就是這個函數的兩個參數。
(3)c語言函數調用參數傳遞什麼意思擴展閱讀:
C語言的參數傳遞方式
方法有3種方式:值傳遞、地址傳遞、引用傳遞
tips:
被調用函數的形參只有函數被調用時才會臨時分配存儲單元,一旦調用結束佔用的內存便會被釋放
值傳遞和地址傳遞,傳遞的都是實參的一個拷貝
C語言中實參和形參之間的數據傳遞是單向的「值傳遞」,單向傳遞,只能由實參傳給形參,反之不行
輸出格式並沒有選擇%p而是選擇了%d,因為十進制的數看起來更直觀。
值傳遞
如果只是傳遞值的話:
#include <stdio.h>
//值傳遞傳值
void swap( int x, int y);
int main()
{
int a=2,b=3;
printf("before:實參為a,b a=%d,地址為%d b=%d,地址為%d ",a,&a,b,&b);
swap(a,b);
printf("after:實參為a,b a=%d,地址為%d b=%d,地址為%d ",a,&a,b,&b);
return 0;
}
void swap(int x,int y)
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf("inside:形參為x,y x=%d,地址為%d y=%d,地址為%d ",x,&x,y,&y);
}
『肆』 在C語言中,函數的形參與實參之間的值傳遞是什麼意思函數調用時如主函數中為swap(a,b),而從函數為
以int 型舉例
voidSwap(int*a,int*b)
{
inttemp=*a;
*a=*b;
*b=temp;
}
voidSwap1(inta,intb)
{
inttemp=a;
a=b;
b=temp;
}
Swap(int *, int *);稱之為實參 實際傳遞的是 a和 b 的地址 啊 , 在調用a與b 的值(*a)使用的是原來的數 下面的 x,y; a , b 的值是x與y 的內存地址
swap1(int ,int); 稱之為形參 實際傳遞的是 a 和b 的值,這里的a和b 與xy沒關系, 只是x與y 的一個副本。
intswap_test()
{
intx,inty;
x=3;y=5;
Swap(&x,&y);
//此時x=5;y=3;
Swap1(x,y);
//此時x=5;y=3;
return1;
}
『伍』 函數參數傳遞什麼意思
這里說的傳遞當然是指 實參是如何傳遞給形參的啦
還挺復雜的~~~~~~~~⊙﹏⊙b汗,這里講述了4種參數傳遞的情況和注意事項:
1.非引用形參
這是最普通,也是最簡單的形參傳遞了。
參數傳遞,即是使用實參副本(注意啊,是副本,不是實參本身)來初始化形參;
因此,在函數體內對形參的修改不會影響實參的值。
如果形參是指針類型的,那麼函數體內是否可以修改指針所指向的對象的值呢?
如果您產生這樣的疑問,表示您很有想法~~~
答案是~~~需要分情況討論。
如果函數的形參是非const類型的指針,則函數可以通過指針實現賦值,修改指針所指向對象的值。
所以,如果需要保護指針指向的值,則形參需定義為指向const對象的指針(注意了,這里的指針依然是非const型的,只是其指向的對象是const型的):
void use_ptr(const int *p)
{
//use_ptr這個函數可以讀指針p所指向的對象,但是不可以修改該對象的值
}
const形參
如果函數使用的是非引用非const形參,則既可以給該它傳遞const實參,也可傳遞非const實參。
如果函數使用的是非引用const形參,也是既可以給該它傳遞const實參,也可傳遞非const實參。那麼這兩者的差別是什麼呢?對於後者,函數連實參的局部副本都不可以改變了。下面是第二種情況的一個例子: void fcn(const int i) {}
復制實參的局限性:復制實參不是在所有的情況下都適合,不是一復制實參的情況如下:
1.當需要在函數中修改實參的值時
2.當需要以大型對象作為實參傳遞時。對實際的應用而言,復制對象所付出的時間和存儲空間代價往往過大
3.當沒有辦法實現對象的復制時
對於上述幾種情況,有效的解決辦法是將形參定義為引用或指針類型。
(終於說完這個最簡單的傳遞方式了,╮(╯▽╰)╭)
2.引用形參
引用形參的用法:1.讓函數修改實參的值
2.向主調函數返回額外的結果(本來return就可以返回一個值給主調函數,而且引用參數可以改變實參的值,所以相當於返回了額外的結果)
3.利用const引用避免復制(當向函數傳遞大型對象時,需要使用引用來提高效率,如果使用引用形參的唯一目的是避免復制實參,則應將形參定義為const引用)
這是一個不適宜復制實參的例子,該函數希望交換兩個實參的值
void swap (int v1,int v2)
{
int tmp=v1;
v2=v1;
v1=tmp;
}
這個例子期望改變實參本身的值,但是swap無法影響實參本身,執行swap時,指示交換了其實參的局部副本,對實參根本沒有改變。解決的方法是:將形參定義為引用類型。
void swap (int &v1,int &v2)
{
int tmp=v1;
v2=v1;
v1=tmp;
}
當調用swap(i,j)時,i和j的值才真正實現了交換。
更靈活的指向const的引用
應該將不需要修改的引用形參定義為const引用。普通的非const引用形參在使用時不大靈活。非const引用形參既不能用const對象初始化,也不能用字面值或者產生右值的表達式實參初始化。(如果函數的形參是非const引用形參,表示在函數體內可能會修改該形參值,即會修改實參的值,因此不可以用const對象來做實參傳遞給這樣的函數,所以不靈活。)
傳遞指向指針的引用
如果想編寫一個與前面交換兩個整數的swap類似的函數,實現兩個指針的交換。已知需用*定義指針,用&定義引用,問題在於,如何將這兩個操作符結合起來一獲得指向指針的引用。
//交換兩個指向整形的指針的值
void ptrswap(int *&v1,int *&v2)
{
int=*tmp=v2;
v2=v1;
v1=tmp;
}
形參int *&v1的定義,應該從右至左的理解:v1是一個引用,與指向int型對象的指針相關聯。也就是說,v1隻是傳遞ptrswap函數的任意指針的別名。
3.vector和其他容器類型的形參
由於復制vector會使得效率降低,多以如果形參是vector的話,我們常常將該形參聲明為引用,避免復制。另一種方法在C++中更為常用,就是通過傳遞指向容器中需要處理的元素的迭代器來傳遞容器。
4.數組形參
由於數組是不可以復制的,所以不可以定義使用數組類型形參的函數。如果函數需要使用數組作為形參,那麼就要通過操縱指向數組中元素的指針來處理數組。以下定義都是正確的:
void printValues(int*){}
void printValues(int[]){}
void printValues(int[10]){}
注意了,雖然不能直接傳遞數組,但是函數的形參可以寫成數組的形式。上面三種定義是等價的,形參類洗個都是int*。
通常,將數組形參直接定義為指針要比使用數組語法定義更好。這樣就明確地表示,函數操縱的是指向數組元素的指針,而不是數組本身。由於忽略了數組長度,形參定義中如果包含了數組長度則特別容易引起誤解。
對於非引用型形參來說,編譯器檢查數組形參關聯的實參時,它只會檢查實參是不是指針、指針的形參和數組元素的類型是否匹配,而不會檢查數組的長度,所以即使實參數組的長度與形參不匹配時,編譯也可以通過,但是在調用時會出錯。
但是對於引用型形參來說,編譯器還會檢查是西安數組的大小與形參的大小是否匹配,所以如果實參數組的長度與形參不匹配,編譯時就會報錯。
如何確保函數的操作不超出數組實參的邊界?方法有三:
1.在數組本身放置一個標記來檢測數組的結束。C風格字元串就是採用這個方法的一個例子,它是一個字元數組,並且以空字元null作為結束的標記。處理C風格字元串的程序就是使用這個標記停止數組元素的處理。
2.使用標准庫規范,傳遞指向數組第一個和最後一個元素的下一個位置的指針。void printValues(const int *beg, const int *end){},如果定義int j[2]={0,1},在調用該函數時,printValues(j,j+2).
3.顯式傳遞表示數組大小的形參。void printValues(const int ia[], size_t size){}
5.可變形參
C++中的省略符形參是為了編譯使用了varargs的C語言程序。
void foo(parm_list,...);
void foo(...);
『陸』 C語言函數調用參數傳遞的是什麼
C語言傳遞的是值而不是地址,這一點從VB轉過來的程序員一定要注意。否則不經意間就會犯錯誤。另外下層函數修改上層函數變數不是一種好習慣,容易引發錯誤。C語言中函數可以返回一個函數值,如果你需要返回多個函數值可以用下面的形式
fun(int *a, int *b)
{ *a=1;*b=2;}
main()
{ int a, b;
fun(&a,&b) a,b的值被改變
}
如果按VB的習慣,
fun(int a, int b)
{ a=1;b=2;}
main()
{ int a, b;
fun(a,b);a、b的值沒有改變
}
是錯誤的,main中的a,b和fun中的a,b完全是兩碼事,結果就是調運fun沒有任何效果。
『柒』 c語言中的值傳遞是怎麼回事
實參的值傳給了形參,形參可以看著是被調函數中的局部變數被調函數可有返回值也可以沒有有返回值用return返回。例如int fun(int a,int b){ int c; c=a+b; return c;}主函數調用:int a,b,c;a=1,b=2;c=fun(a,b);沒有返回值的函數通常形參都是指針變數,那樣可以直接改變變數的值,例如fun(int *a){ *a=5;}主函數調用int b=1;fun(&b);這里調用fun後,b的值就變為5了而如果你的函數是fun(int a)這樣b的值是不會變化的,這要你去理解指針
『捌』 C語言中的傳值調用時什麼意思呀
在c語言中每一個變數都有兩個屬性一個是值,一個是址。比如
inta=2;
變數a的值是2,變數a的地址,可以用&取地址操作符獲取,即&a。
因此以C語言的函數傳遞中具備兩種方式傳遞參數,一種是傳址,一種傳值。比如
voidf1(intv){;}//函數f1
voidf2(int*p){;}//函數f2
f1(a);//這里傳值
f2(&a)//這是傳址
『玖』 簡答題,c語言中函數傳遞參數的方式有哪2種,含義是什麼
一:值傳遞,只是把一個變數的值復制到調用函數中去。
二:引用傳遞,把變數的地址(即指針)傳到調用的函數去,調用的函數對變數的地址進行的操作 會改變參數的值。
『拾』 c語言函數調用時,參數是如何傳遞的
建立中間變數(形參),把實參值賦值給中間變數,當被調函數返回值時,系統釋放掉中間變數。
在程序中通過對函數的調用來執行函數體,其過程與其它語言的子程序調用相似。對無參函數調用時則無實際參數表。實際參數表中的參數可以是常數、變數或其它構造類型數據及表達式。各實參之間用逗號分隔。
函數作為表達式中的一項出現在表達式中,以函數返回值參與表達式的運算。這種方式要求函數是有返回值的。例如:z=max(x,y)是一個賦值表達式,把max的返回值賦予變數z。
(10)c語言函數調用參數傳遞什麼意思擴展閱讀:
C語言中又規定在以下幾種情況時可以省去主調函數中對被調函數的函數說明。
1、如果被調函數的返回值是整型或字元型時,可以不對被調函數作說明,而直接調用。這時系統將自動對被調函數返回值按整型處理。例8.2的主函數中未對函數s作說明而直接調用即屬此種情形。
2、當被調函數的函數定義出現在主調函數之前時,在主調函數中也可以不對被調函數再作說明而直接調用。例如例8.1中,函數max的定義放在main 函數之前,因此可在main函數中省去對max函數的函數說明int max(int a,int b)。
3、如在所有函數定義之前,在函數外預先說明了各個函數的類型,則在以後的各主調函數中,可不再對被調函數作說明。