c按引用傳參
A. C 有 「按引用傳遞」 嗎
沒有。嚴格地講, C 總是按值傳遞。可以自己模擬按引用傳遞, 定義接受指針的函數回, 然後在調用答時使用 & 操作符。事實上, 當向函數傳入數組 (編譯器本質上就是在模擬按引用傳遞。但是C沒有任何真正等同於正式的按引用傳遞或 C++ 的引用參數的東西。另一方面, 類似函數的預處理宏可以提供一種「按名稱傳遞」的形式。
B. C語言中函數參數傳遞問題:引用傳遞。
參數3中傳遞方式.
值傳遞,址傳遞,
引用傳遞.
後兩者
才是對傳入的參數的實際操作.
第一個是
操作的
傳入參數的拷貝副本.
C. C語言中的值傳參和引用傳參是指什麼
在C語言中其實沒有引用傳參,都是值傳參。即傳遞的都是實參的副本。
如下示例,
//交換兩個參數的值,值傳參
void swap(int x, int y)
{
int temp = x;
x = y;
y = temp;
}
int a = 2, b =1;
swap(a,b); //a,b的值不會改變,因為改變的是實參a,b的副本。
另一個示例:
//所謂的「引用傳參」,交換兩個數值
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = tem;
}
int a =2, b = 1;
swap(&a, &b);//a,b的值改變
其實這里引用傳參,傳遞的也是參數的副本,只是這個副本是變數a,b的地址,所以你在函數swap中你並不能通過參數改變變數a,b的地址,因為它只是一個副本,是值傳遞。但你得到變數的地址,你就可以訪問和改變變數的內容,所以在第二個swap函數中,你可以通過*x和*y來改變實參的值,從而可以達到交換變數a,b值的效果。但這並不是引用傳遞。只是有這樣的說法。推薦你去秒秒學上看看相關的內容,我也是從那上面學來的。
D. C語言到底支不支持引用傳遞做函數參數
「引用傳遞做函數參數」是C++的特性,C語言不支持。
//C語言要這樣寫:
voidExchg3(Rect*x,Rect*y){/*...*/}
//然後傳遞指針:
Exchg3(&a,&b);
E. C語言中的「值傳參」和「引用傳參」分別是指什麼
在C語言中其實沒有引用傳參,都是值傳參。即傳遞的都是實參的副本。
如下示例版,
//交換兩個參數的值,值傳參
void swap(int x, int y)
{
int temp = x;
x = y;
y = temp;
}
int a = 2, b =1;
swap(a,b); //a,b的值不會改變,因為改變的是實參a,b的副本。
另一個示例:
//所謂的「引用傳參」,交權換兩個數值
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = tem;
}
int a =2, b = 1;
swap(&a, &b);//a,b的值改變
其實這里引用傳參,傳遞的也是參數的副本,只是這個副本是變數a,b的地址,所以你在函數swap中你並不能通過參數改變變數a,b的地址,因為它只是一個副本,是值傳遞。但你得到變數的地址,你就可以訪問和改變變數的內容,所以在第二個swap函數中,你可以通過*x和*y來改變實參的值,從而可以達到交換變數a,b值的效果。但這並不是引用傳遞。只是有這樣的說法。推薦你去秒秒學上看看相關的內容,我也是從那上面學來的。
F. C++中傳值參數和引用參數怎樣區別
舊事重提,看以下例子:
#include<iostream>
using namespace std;
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
main()
{
int a=3,b=5;
cout<< "before 『swap』:a="<<a<<",b="<<b<<endl;
swap(a,b);
cout<<"after 『swap』:a="<<a<<",b="<<b<<endl;
}
這個例子是傳值調用, 意思就是 形參 的 改變不會影響 實參的值。
你運行一下可知 主函數調用了swap函數後 a,b的值並沒有發生交換。
原因是,調用swap函數時 編譯器為 swap(int a,int b) 中的形參 a , b單獨分配內存空間,並接受主函數傳遞來的值,這塊內存空間和 main()函數中的 a ,b 不是同一內存空間。 所以在swap(int a,int b) 中 a , b發生了交換,但main函數中a , b沒發生交換。即主調函數與被調函數的操作對象各不相同,參數僅在調用時由實參向形參傳遞,而不可由形參向實參傳遞。
要使a ,b發生交換 需要使用傳址調用。程序改為如下:
#include<iostream>
using namespace std;
void swap(int & a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
cout<<"in 『swap』:a="<<a<<",b="<<b<<endl;
}
main()
{
int a=3,b=5;
cout<< "before 『swap』:a="<<a<<",b="<<b<<endl;
swap(a,b);
cout<<"after 『swap』:a="<<a<<",b="<<b<<endl;
}
引用可以看作是一個變數的別名,使用 引用 時 ,對於void swap(int a,int b) 編譯器並沒有給形參a,b分配新的內存空間,只是使 形參a,b指向了main函數中實參a,b的內存空間,他們共享同一內空間,即把地址給了形參。所以在void swap(int a,int b)函數中對這塊內存的改變也就改變了實參的值。
除了使用引用,也可以使用指針。
指針方式和引用方式都屬於傳址調用。
G. 關於C++按引用傳遞參數的問題
int func(int a,int &b,int&c); 中的b,c是形參,func(a,b,c);中b,c是實參。名字雖然想同,但作用域是不同的main中abc作用域整個main函數,func中abc作用域func函數,經過編譯器處理後名字是不同的,可能是main_a,func_a
介紹一下引用 int b=3,int &a=b;引用必須定義的時候被初始化,雖然定義了兩個變數,但其實變數a並沒有被分配內存地址,變數a,b都用b的內存地址。
H. 誰能說一下C語言參數傳值和傳引用是什麼概念,謝謝!:)
你好!
傳值只是把這個變數的值賦給形參,改變形參的值,實參不變。傳引用時改變形參,實參也會改變。
希望對你有所幫助,望採納。
I. C語言 傳值 傳址 傳引用
我來詳細解釋一下: void test1(int a)
{
a = 100; //這里的a是根據參數a而構造出的一個副本,暫存於棧中,與實際參數a完全處於不同內存。
//當函數退出時,a自動無效,修改a的值只是修改棧中這個a的值,無法修改實參。
//如果使用的是C++傳遞的是一個類的話,同樣需要構造一個副本,函數退出時也會析構
//該副本,因此會加大構造和析構的開銷,同時會加大內存開銷用於保存臨時副本
}void test2(int* a)
{
*a = 1000; //這里的a和傳值一樣,也是構造的一個副本,不過這個副本是一個指針,同樣暫存域棧中
//同樣需要加大創建這個指針副本的內存,32位機器為4位元組,即存放這個副本用的
//同樣與實參a指針處於完全不同的內存
//但是,雖然這兩個指針處於不同內存,他們指向的地址卻是同一個地址
//我們通過*操作符來解析指針指向的地址的值(簡稱解引用)
//*a = 5;這句代碼的意思是將副本a指向的地址的值改變為5
//由於副本a指向的地址與實參指向的地址相同,即改變了實參指向的地址的值
//因此實參a指向的地址的值變成了5 //可以解釋的形象一些,
//假如實參a自身處於內存0x01,它指向地址0x03
//那麼這個副本處於的內存不會是0x01(因為它是構造出來的一個副本指針),我們假設它自身地址
//為0x02(只是假設,這個地址值肯定是在棧當中的),而它指向的地址一樣是0x03
}void test3(int* a)
{
int tmp;
a = &tmp; //接著test2講,由於這里的a是一個構造的副本,如果我們改變它,讓它指向tmp的地址
//就不會改變實參指向的地址的值,這里只是將副本指向的地址改變了而已 //解釋的形象一些,
//同理假設實參a自身內存為0x01,它指向地址0x03
//這里的a的自身內存為0x02,它也指向地址0x03
//tmp地址為0x04
//a = &tmp;這句代碼的意思是讓a指向tmp的地址,即副本a指向了tmp地址0x04
//而實參a指向的地址的值沒有發生任何變化
*a = 10000; //這里對形參a的任何操作已經於實參a毫無任何關系了
//因為它自身地址是0x02,它指向的地址是0x04
}void test4(int& a)
{
a = 100000; //這里的a與實參a完全一樣了,在這里對a的任何操作等價於對實參a的操作
}
void main()
{
int a = 1;
int b = 2;
int c = 3;
int d = 4; printf("操作前各值\na:%d\tb:%d\tc:%d\td:%d\n", a, b, c, d); test1(a);
test2(&b);
test3(&c);
test4(d); printf("操作後各值\na:%d\tb:%d\tc:%d\td:%d\n", a, b, c, d);
} 附圖:
J. 在c語言編程中,傳值方式和傳引用方式之間有什麼區別
在C語言中,並沒有引用的概念,這個是C++的概念。
在C++的函數參數中,有兩種形式,其中
TYPE
&
var的形版式,稱為傳引用方式;
TYPE
var的形式,稱為傳值。
二者的區別為,當傳引用時,實際傳到函數中的權形參,是實際參數的一個引用,而不是僅傳遞值到函數中。具體的表現有以下幾條:
1
傳引用時,形參和實參是同一個變數,即使用相同的內存空間,二者有相同的地址。而傳值時二者地址不同;
2
傳引用時,由於沒有新建變數,所以對於類對象參數,不會產生構造和析構。而如果是傳值調用,調用時會進行構造,退出函數時會進行析構;
3
由於傳引用使用的是原本實參的地址,所以對引用參數值的修改,會在退出函數後體現在主調函數中,而傳值調用對參數的修改不會影響到主調函數。