1.標準資料型別,int ,char 等。
如果c傳遞的是單個資料型別,會在被調函式中重新建立乙個物件。
所以,無論我們在被調函式中怎麼修改,主調函式的值不會發生變化。
2.陣列。
當我們傳遞的引數是乙個陣列時,c傳遞的是陣列首元素的位址。
所以當我們在被調函式中做修改了,主調函式的值也會變化。
3.自定義資料型別,struct。
首先,對於單個的struct,它的記憶體分配情況符合上述標準的邏輯。
void test_pass_str_name(t_str test)
在被呼叫時,test會被重新分配一塊記憶體,data值和主調函式的值相等,prive的值也和主調函式相同(指向同一片記憶體區域)。
我們給prive申請一塊記憶體後,它指向了乙個全新的記憶體區域。
此時,不論我們怎麼修改data,和prive指向的記憶體區域的值,都不會影響主調函式。
但是,自定義資料有個特殊情況,那就是裡面帶有指標。當我們傳遞乙個資料元素時,被調函式會拷貝全部的數值給新的物件,指標也會拷貝,此時,雖然他們是兩個不同的物件,但是因為他們的指標都指向同一片記憶體區域,所以我們在被調函式中修改了指標指向的內容時,主調函式的值也會改變。
void test_pass_str_name_point(t_str test)
test_pass_str_name_point(test);
printf(" after pass pointer, dump in call fun \n");
dump_str(test);
我們在主函式中再次列印字串,發現值已經變了。
#include #include #include #define prive_length 64typedef struct t_str;
void dump_str(t_str str)
else
printf("<---------------\n");
}void test_name()
void test_pass_str_name(t_str test)
void test_pass_str_name_point(t_str test)
void test_pass_str_array_name(t_str test[1])
void test_str_pass_name()
#define array_size 10
typedef char array[array_size];
void dump_char_array(array array){
printf("------------->\n");
for(int i=0; i執行結果:
test str
------------>
str.data:=0
str.prive is null
<---------------
in pass fun
------------>
str.data:=1
str.prive:= hello
<---------------
pass fun end
------------>
str.data:=0
str.prive is null
<---------------
in pass fun
------------>
str.data:=1
str.prive:= hello
<---------------
pass fun end
after pass pointer, dump in call fun
------------>
str.data:=0
str.prive:= hello
<---------------
test str array
------------>
str.data:=0
str.prive is null
<---------------
in pass fun
------------>
str.data:=1
str.prive:= hello
<---------------
pass fun end
------------>
str.data:=1
str.prive:= hello
<---------------
test pass char
in pass name fun
------------->
array[0]:= 0 array[1]:= 1 array[2]:= 2 array[3]:= 3 array[4]:= 4 array[5]:= 5 array[6]:= 6 array[7]:= 7 array[8]:= 8 array[9]:= 9
<------------
pass name fun end
------------->
array[0]:= 0 array[1]:= 1 array[2]:= 2 array[3]:= 3 array[4]:= 4 array[5]:= 5 array[6]:= 6 array[7]:= 7 array[8]:= 8 array[9]:= 9
<------------
C語言傳遞指標引數
簡單來說,指標是乙個儲存計算機記憶體位址的變數。所有的指標都儲存了記憶體位址。它們的型別只在取值時起作用。指標在c語言中是個十分重要的概念,可以搜尋相關資料進行深入學習,也可以參考 c語言指標簡介 簡單了解。c語言函式引數傳遞有兩種方式,一種是傳值呼叫,一種是傳址呼叫。那麼如果指標作為引數,應該怎麼...
關於C語言傳遞引數的問題
要求 編寫乙個函式,將rgb資料顯示到tft彩屏上,rgb資料為565格式,平台 stm32f030 lcd st7735s 編譯平台 mdk5.14 對於這個一般的來說很多人會這麼寫 void lcd draw rgb u16 x,u16 y,u16 x size,u16 y size,u16 p...
Go語言傳遞變長引數
如果函式的最後乙個引數是採用.type的形式,那麼這個函式就可以處理乙個變長的引數,這個長度可以為 0,這樣的函式稱為變參函式。func myfunc a,b,arg int 這個函式接受乙個類似某個型別的 slice 的引數 詳見第 7 章 該引數可以通過第 5.4.4 節中提到的 for 迴圈結...