函式傳遞陣列 例子

2021-06-05 11:26:48 字數 1045 閱讀 9773

函式傳遞陣列的問題

void fun(char b[10])

如果陣列b 真正傳遞到函式內部,那i 的值應該為10。但是我們測試後發現i 的值竟然

為4!為什麼會這樣呢?難道陣列b 真的沒有傳遞到函式內部?是的,確實沒有傳遞過去,

這是因為這樣一條規則:

c 語言中,當一維陣列作為函式引數的時候,編譯器總是把它解析成乙個指向其首元

素首位址的指標。

~~~能否把指標變數本身傳遞給乙個函式?

void fun(char *p)

int main()

這個函式呼叫,真的把p2 本身傳遞到了fun 函式內部嗎?我們知道p2 是main 函式內的乙個區域性變數,它只在main 函式內部有效。

(這裡需要澄清乙個問題:main 函式內的變數不是全域性變數,而是區域性變數,只不過它的生命週期和全域性變數一樣長而已。全域性變數一定是定義在函式外部的。初學者往往弄錯這點。)

既然它是區域性變數,fun 函式肯定無法使用p2 的真身。那函式呼叫怎麼辦?好辦:對實參做乙份拷貝並傳遞給被呼叫的函式。即對p2 做乙份拷貝,假設其拷貝名為_p2。那傳遞到函式內部的就是_p2 而並非p2 本身。(那麼我們怎麼傳遞呢,1.用位址 2.用返回值,上個帖子說過這個問題)

~~~二維陣列引數與二維指標引數

前面詳細分析了二維陣列與二維指標,那它們作為引數時與不作為引數時又有什麼區別呢?看例子:

void fun(char a[3][4]);

c 語言中,當一維陣列作為函式引數的時候,編譯器總是把它解析成乙個指向其首元素首位址的指標。這條規則並不是遞迴的,也就是說只有一維陣列才是如此,當陣列超過一維時,將第一維改寫為指向陣列首元素首位址的指標之後,後面的維再也不可改寫。比如:a[3][4][5]作為引數時可以被改寫為(*p)[4][5]。

傳參時的等效

陣列引數

等效的指標引數

陣列 : char a[10] 指標 : char * p;

陣列的陣列:char a[3][4] 陣列的指標:char (*p)[4]

指標陣列: char *a[5] 指標的指標:char **p

函式傳遞多維陣列

一維陣列作為函式引數可以寫成 f int array int size 或者 f int array int size 中的陣列的維數可選 二維陣列作為函式引數可以寫成 f int array 10 int size1 int size2 的形式,除了第一維的引數可以省略,其他的引數必須顯示說明。以...

函式指標陣列的例子

來看這麼一段 include stdio.h include stdlib.h include string.h enum response type typedef struct response void dump response r void second chance response r...

陣列作為函式引數傳遞

陣列有兩個特殊的性質。一是不能複製陣列 二是使用陣列名字時,陣列會自動轉化為指向其第乙個元素的指標。由於陣列不能複製,所以無法編寫使用陣列型別形參的函式,因為陣列會被自動轉化為指標。一 一維陣列 1.三種定義形式 void printvalues int void printvalues int v...