指標是c語言中比較難理解的部分。(尤其是對於 * & 的使用不是很清楚)下面我們講看看幾個小例子。
在這裡插入**片
int n=5;
printf
("n=%d\n"
,n);
int b=n;
printf
("b=%d\n"
,b);
printf
("n位址=%d\n"
,&n)
;printf
("b位址=%d\n"
,&b)
;
結果
n=5
b=5n位址=6487580
b位址=6487576
從上述的結果中我們可以看到,b=n;操作將n的值複製給b,此時b的位址與n的位址不同,說明b在記憶體中開闢了一塊新的記憶體空間。
接下裡我們這樣更改上訴**(引用,相當於給)
int
&b=n;
結果
n=5b=5
n位址=6487572
b位址=6487572
從上述的結果中我們可以看到,&b=n;操作將n的值複製給b,此時b的位址與n的位址相同同,那麼我們猜想兩種情況中如果b+1以後,n的值怎樣??
第一種情況中對b加一顯然不會使得n變化,而二種情況中顯然會使n變化,因為b+1改變了原有的記憶體位址,導致n發生變化。
根據上述兩種情況即為傳值呼叫和引用呼叫。
接下來我們看另一種情況
int n=5;
int*b=
&n;printf
("n=%d\n"
,n);
printf
("b=%d\n"
,b);
printf
("n位址=%d\n"
,&n)
;printf
("b指向位址的內容=%d\n"
,*b)
;
結果
n=5b=6487580
n位址=6487580
b指向位址的內容=5
int 型別的指標b將變數n的位址存放在了b中。
*b取得了b指向的位址中的內容即n的值5
接下來我們分別執行
b=6487572
n位址=6487572
b指向的記憶體中的內容=5
b+=1
;
b=6487576
b指向的記憶體中的內容=6487576
n=5n位址=6487572
我們發現b的值和多指向的內容變為了6487576(int 4),而未改變n中的內容
n=5b=6487572
n位址=6487572
b指向的記憶體中的內容=5
*b+=1
;
b=6487572
b指向的記憶體中的內容=6
n=6n位址=6487572
我們發現n的值和位址已經發生了改變。
``總結
傳值時(a,b) int (int x,int y)x,y變動與a,b變動無關(位址不同)
引用(a,b) int (int &x,int &y) a,b會隨著想x,y變動變動(位址相同)
位址 (&a,&b)int (int *x,int *y)相當於
x=&a;
y=&b;
a,b會隨著 *x,*y改變而改變
(本人水平有限,歡迎指正交流)
傳值呼叫與傳位址呼叫(傳引用)
c c 中引數傳遞有兩種方式,傳值或傳位址 傳引用 通常我們要在被呼叫函式中改變乙個變數的值就需要傳位址呼叫方式,例如 void swap by value int a,int b void swap by ptr int pa,int pb int main int argc,char argv ...
C 函式的傳值呼叫 指標呼叫 引用呼叫
該方法把引數的實際值複製給函式的形式引數。在這種情況下,修改函式內的形式引數對實際引數沒有影響。include using namespace std 函式宣告 void swap int x,int y int main 函式定義 void swap int x,int y 呼叫函式的時候,在函式...
傳值呼叫和引用呼叫
值呼叫是指當發生函式呼叫時候,給形參分配記憶體空間,並用實參來初始化形參 直接將實參的值傳遞給形參 這一過程是引數值的單向傳遞過程,一旦形參獲得了值,便於實參脫離了關係,此後無論形參發生了什麼變化,都不影響實參了.引用呼叫將引用作為形參,在執行主調函式中的呼叫語句時候,系統自動用實參來初始化形參.這...