本文目錄一覽:
C語言里的傳地址引用問題
c語言參數是不能改變的,這是基本規則。試圖改變變量地址值,是不允許的。地址裡面存放的內容,才是可以改變的。
swap(int *p1,int *p2)
{int t;
t=*p1;
*p1=*p2;
*p2=*p1;
}
要改變地址,要用指針的指針。
int **p1,int **p2
C語言數據結構中地址傳遞問題。
指針只是內存地址,他需要指針實體才具備數據操作;
而類型定義的變量在C語言是個實體對象,它包含數據在內;
你聲明了一個結構指針,卻沒有結構實體,是不能進行操作的;你的指針不知指到哪裡去,運行就死了。
想用指針,應該這樣:加個結構實體,指針指向結構實體就可以了。
stacklist Ro,*s;
s=&Ro;
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);
} 附圖:
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/271388.html