【問題】
定義了一個子函數,傳參的內容是一個二維數組
編譯提示錯誤
因為多維數組作為形參傳入時,必須聲明除第一位維外的確定值,否則系統無法編譯(算不出偏移地址)
【二維數組的傳參】
方法一:形參為二維數組,並給出第二維長度
舉例:
#include <stdio.h>
void subfun(int n, char subargs[][5])
{
int i;
for (i = 0; i < n; i++) {
printf("subargs[%d] = %s\n", i, subargs[i]);
}
}
void main()
{
char args[][5] = {"abc", "def", "ghi"};
subfun(3, args);
}
方法二:形參作為指向數組的指針並給出數組長度
#include <stdio.h>
void subfun(int n, char (*subargs)[5])
{
int i;
for (i = 0; i < n; i++) {
printf("subargs[%d] = %s\n", i, subargs[i]);
}
}
void main()
{
char args[][5] = {"abc", "cde", "ghi"};
subfun(3, args);
}
我用了這個方法:
方法三:形參為指針的指針
實參必須有指針,不能為數組名
#include <stdio.h>
void subfun(int n, char **subargs)
{
int i;
for (i = 0; i < n; i++) {
printf("subargs[%d] = %s\n", i, subargs[i]);
}
}
void main()
{
//char* a[3]是一個指針,a[0]存儲的是args[0][0]的地址,a[1]存儲的是args[1][0]的地址,a[2]存儲的是args[2][0]的地址。
char *a[3];
char args[][5] = {"abc", "def", "ghi"};
a[0] = args[0]; //equals with a[0] = &args[0][0];
a[1] = args[1];
a[2] = args[2];
subfun(3, a); //若此處為subfun(3, args);則會編譯出錯
//a的值是a[0]的地址,所以a = &args[0];
}
上述代碼等價於下面代碼。
#include <stdio.h>
void subfun(int n, char **subargs)
{
int i;
for (i = 0; i < n; i++) {
printf("subargs[%d] = %s\n", i, subargs[i]);
}
}
void main()
{
char *args[] = {"abc", "def", "ghi"};//equals with char *args[3] = {"abc", "def", "ghi"};
subfun(3, args);
}
【總結】二維字符數組的創建和引用的最佳方法
傳參,輸出:
聲明還是這樣比較易懂:
上述的第三種方法我還是不太會
【參考資料】
C/C++二維數組傳參方法總結 https://blog.csdn.net/gqb_driver/article/details/8886687