函式傳遞指標的問題,指標變數 引數函式 值傳遞 的問題

2024-12-30 08:30:42 字數 3408 閱讀 3449

1樓:網友

我覺得是這樣的:

initlist_l(&l); 這一句的確把l的引用傳進initlist_l函式里了,但是注意initlist_l函式的第一句語句:

l = lnode *)calloc(1, sizeof(lnode));即用calloc分配記憶體,而事實上main函式中struct lnode l; 宣告的同時已經為其分配記憶體了,只是沒有初始化,現在又用calloc為其分配,其實使得在initlist_l中的l指向乙個新的lnode結點l',修改了函式中l的指標,這樣你對l'的data賦值,退出函式後再print l的data,應該還是沒有初始化的。

總而言之,關鍵就在那句l = lnode *)calloc(1, sizeof(lnode));你如果把它註釋掉,結果肯定就是你希望的0了。

希望這個你能滿意。

2樓:沒事兒偷著崩潰

因為你定義的l是stuct lnode類的普通變數,在呼叫函式initlist_l(&l)時,進行的是值傳遞,進行的運算是傳遞不回來的,而你在定義時沒有給l賦初值,執行出來就是初始的垃圾值啦,這也就是為什麼我們有時候要用指標進行引數傳遞了。

3樓:網友

#include

#include

struct lnode{

int data;

struct lnode * next;

int initlist_l(struct lnode * l){/l = lnode *)calloc(1, sizeof(lnode));

上句去掉。l->data = 0;

l->next = null;

return 0;

int main(){

struct lnode l;

initlist_l(&l);

printf("%d", ;

return 0;

這位仁兄大概是腦子一混搞錯了吧。

在main 已經例項化了lnode的 l。 它不是乙個指標 不需要傳遞進函式再動態建立。去掉那句話試試 應該是你要的效果。

呵呵 107395975qq

4樓:掉頭髮大叔

l = lnode *)calloc(1, sizeof(lnode));

這句去掉。傳進來的引數不需要再另外申請空間了。

指標變數 引數函式 值傳遞 的問題

5樓:迪達拉

首先你要知道c語言編譯器系統是根據記憶體位址對記憶體中的資料進行的操作的,比如:int i=1,j=2;那麼i和j在記憶體中有自己相應的記憶體位址,系統執行i+j時,系統會根據i,j的記憶體位址找到i,j記憶體中的數值,再進行運算的,所以上面的問題就是這樣乙個樣子,這是乙個記憶體中的值交換,,而這是記憶體位址的乙個交換。就像我們要進一件房間找東西,我們得知道門牌號吧,記憶體位址就可以理解成門牌號,你要交換房間的東西有兩種辦法:

1,直接交換東西,即a房間的東西放b房間,b房間東西放a房間。

2,還有就是交換門牌號。

這樣做的意義就是當資料不好移動的時候,就如兩個房間有很多東西,是不是交換門牌號來得更直接,更快?

6樓:網友

使用者函式中使用的是區域性變數,將主函式中的變數通過傳值賦給使用者函式中的區域性變數,交換變數值改變的只是區域性變數的值,主函式中變數值沒被交換,但如果是將位址作為引數傳入,使用者函式改變的是記憶體中指標的指向,指向交換了,主函式中的指標指向也就改變了。

指標實際上是乙個記憶體位址,用指標傳入實際上是改變了記憶體中儲存的內容,是直接對計算機記憶體進行操作。

7樓:我是_羅東

可以從作用域理解形參為什麼不能進行值傳遞:

形參它的作用範圍只在定義的子函式內,程式跳出子函式,形參就消失也就是形參在子函式定義時,在記憶體中臨時開闢空間儲存這個形參。一旦跳出這個子函式,形參就不存在。

而指標,你可以理解為指向記憶體中實體地址,通過指標,就能訪問指標所指向記憶體的實體地址中的內容。

8樓:開拓者

對指標變數的加減只能改變位置不能直接改變其所在位址的值。

9樓:網友

比如void swap(int x,int y)..int a=3,b=4;

swap(a,b);

此處將變數a的值3傳遞給x,b的值4傳遞給y,此後再swap函式中便與ab無關了,xy再怎麼改變,ab都不會變的。

其實傳位址的道理是一樣的,不過要區別的是:位址沒變,位址裡面的內容變了。

比如void swap(int *p1,int *p2)..int a=3,b=4;

int *pa=&a,*pb=&b;

swap(pa,pb);

注意此處將ab的位址傳遞給了形參p1,p2,而在swap中是通過位址改變了引數的值,我們假定變數a在記憶體中的位址是2000,變數b在記憶體中的位址是3000,將2000和3000分別傳遞給p1,p2,然後*p1=5;通過p1指標內的位址改變了裡面的值,也就是將記憶體位址2000裡面的內容改為5,又將記憶體3000裡面的內容改為了6,然後返回主函式後,這時pa,pb的指向並沒有改變,pa仍指向a,pb仍指向b,但是ab裡面的內容則發生了改變。

這邊再仔細推敲一下吧,希望對你有幫助。

函式指標的問題

10樓:網友

1全部優點是:

1)同一函式指標變數可以儲存不同的函式名,即可以實現不同函式的呼叫,這實際上是"多型"的內容;

2)通過函式指標可以很好地完成"選單"程式設計技術,mfc中的訊息就是靠"函式指標"來實現呼叫的。

3)函式指標可以作為形式引數,實現在乙個函式中用通過函式指標呼叫其它函式的目的。

總之,"函式指標"屬於c語言的高階程式設計專題。

舉一例:#include

int add(int x,int y);

int subs(int x,int y);

int mult(int x,int y);

int divi(int x,int y);

typedef int (*fun)(int,int);

fun f[4]=;

int add(int x,int y)

int subs(int x,int y)

int mult(int x,int y)

int divi(int x,int y)

main( )

請注意,f[i](a,b). 雖然形式是一樣的,但是根據不同的i執行了不同的函式。

11樓:網友

動態分配記憶體空間。

函式呼叫函式外的資料。

陣列操作話說更快。

12樓:網友

提高執行速度。

在有些函式返回值相同,型別和引數都相同,就是名字不同時,可以快速定位到函式的。

c指標變數的問題,C語言指標變數大小的問題

p 1,是把1賦值給p所指向的物件,而p 1是把1賦值給p,這個1是被當做位址的。p 1和p 1是不同的概念,p 1 是賦值語句,還有在c語言中 1 0 是作為真假來用的,就相當於布林型數一樣。這兩個語句都是合法的。區別就是指標 的意思是取位址的意思。p是乙個指標,他的值是記憶體中一塊記憶體的位址,...

C語言中定義函式,變數是指向指標的變數,呼叫時要怎麼呼叫

首先fact函式返回的是double型別,第乙個引數是double型的二維指標.所以是 c i fact c,y,z 因為double c 3 是二維double指標,c i 是乙個double一維指標,c i 就是double型資料。c是二維指標,可以傳過去 c i fact c,y,z c i ...

C語言關於函式傳遞引數問題

好久沒接觸過c了,有些忘了,講講我的理解。int a 10 表示a是乙個指向 int 指標的陣列,它和a 10 10 是一樣的,而和int a中的a性質是一樣的,都是指向int 的指標,但有點區別 int a 10 中 a 位址向前移動10位而int a 中的a 位址移動一位。所以我的結論是 voi...