C语言函数参数传递详解
1.值傳遞和地址傳遞
? (1)值傳遞:即按“值(如數(shù)字10)”傳遞參數(shù),是將實參變量的值復(fù)制一個到臨時存儲單元中(該存儲單元會隨著調(diào)用的函數(shù)運(yùn)行結(jié)束而釋放掉),如果在調(diào)用過程中改變了形參的值,不會影響實參變量本身,即實參變量保持調(diào)用前的值不變
?(2)地址傳遞:即按“地址(如0019FEDC)”傳遞參數(shù),把實參變量的地址傳送給被調(diào)用函數(shù),形參和實參共用內(nèi)存的同一地址。在被調(diào)用過程中,形參的值一旦改變,相應(yīng)實參的值也跟著改變
注:值傳遞在函數(shù)調(diào)用過程中會為形參重新開辟空間,形參與實參分別占用不同的地址空間,而地址傳遞,形參和實參共用同一內(nèi)存地址
舉栗子:
①值傳遞(普通類型變量的參數(shù)傳遞)
void fun1(int a){
?? ?a=2;
?? ?printf("在fun1函數(shù)中,變量a值的地址是:%p\n",&a);
?? ?a=a+1;
}
void main(){
?? ?int n=1;
?? ?printf("在main函數(shù)中,變量n的地址是:%p\n",&n);
?? ?fun1(n);
?? ?printf("fun1函數(shù)中形參a加1之后,實參n的值是%d\n",n);//n的值任然不變還是1
}
運(yùn)行結(jié)果
②地址傳遞(指針作為參數(shù))
void fun2(int *q){
?? ?printf("在fun2函數(shù)中q的值是(和m的地址,p的值一樣):%p\n",q);
?? ?*q=*q+5;
}
void main(){
?? ?int m=10;
?? ?int *p=&m;
?? ?printf("在main函數(shù)中,m值的地址:%p\n",&m);
?? ?printf("在main函數(shù)中,p指針的值(p所指向變量的地址):%p\n",p);
?? ?printf("在main函數(shù)中,p指針的地址(指針變量本身也要占存儲單元):%p\n",&p);
?? ?fun2(p);//傳的是p的值,該值是m的地址
?? ?printf("執(zhí)行fun2函數(shù)后,m的值是(由于形參和實參共用內(nèi)存的同一地址,形參改變實參也改變):%d\n",m);
}
注:當(dāng) “ * ” 有兩個作用 。作用一(定義指針變量):int *p;? ?作用二(取值):int m=10;? int p=&m;? printf(*p)//輸出10
運(yùn)行結(jié)果
③數(shù)組名的參數(shù)傳遞
“數(shù)組名的值”和數(shù)組的地址都存儲了數(shù)組的首地址
void fun3(int arr[]){
?? ?for(int i=0;i<5;i++){
?? ??? ?printf("%d",arr[i]);
?? ?}
}
void fun4(int *arr){
?? ?for(int i=0;i<5;i++){
?? ??? ?printf("%d",arr[i]);
?? ?}
}
void main(){
?? ??? ?int arr[5]={1,3,5,7,9};
?? ??? ?int*r;
?? ??? ?r=arr;
?? ??? ?fun3(arr);//傳數(shù)組名
?? ??? ?printf("\n");
?? ??? ?fun4(r);//傳遞指針
?? ??? ?printf("\n");
?? ??? ?printf("數(shù)組名的值:%p\n",arr);
?? ??? ?printf("數(shù)組的地址值:%p\n",&arr);
}
運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的C语言函数参数传递详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分段处理_连续油管无限级可开关固井滑套分
- 下一篇: docker mysql关掉后启动_Do