2021年5月29日 星期六

c 語言傳遞二維陣列給函式時, 應該用什麼型別來接收這個二維陣列

the 1st edition: 2018/5/8
傳送陣列到函式時, 只傳指標過去, 這是什麼意思? 當然是字面上的意思。

char *str[10], 將 str 傳給 function 時, 是傳一個 pointer, 這個 pointer 指向 char*
ref: L38, L39

char str[5][10], 將 str 傳給 function 時, 是傳一個 pointer, 這個 pointer 指向 char [10]
所以一個要用 char** 接, 一個要用 char (*)[] 接
然後 int **argv 和 int*argv[] 是同樣的意思

但是

argv.c 這個範例我故意改用 int *argv[] 而不是 char *argv[], 因為 char *argv[] 又會讓情形更混亂, 所以最後我修改為 int *argv[]。

int *argv[]
int *str[10]

這個很有趣, 根據 *, [] 的優先順序, 這個應該是 int *(str[10]), 也就是 str 應該是 array, 可是 argv 卻不是 array, 而是指標, 不過 int *argv[] 只能寫在函式 prototype 裡頭。

argv.c
 1 #include <stdio.h>
 2 
25 
26 int f(int argc, int (*argv)[])
27 {
28   return 0;
29 }
30 
31 // equal char **argv
32 void f5(int argc, int *argv[])
33 {
34 }
35 
36 int main(int argc, char *argv[])
37 {
38   int *strings[10] = {(int *)0x123, (int *)0x789};
39   f5(2, strings);
40 
41   int str[5][10] = {{1,2,3}, {7,8,9}};
42   f(2, str);
43   return 0;
44 }

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。