对于以下代码,如何将char[][]
作为char**
参数传递?
#include <stdio.h>
#include <string.h>
void fn(int argc,char** argv)
{
int i=0;
printf("argc : %d\n",argc);
for(i=0;i<argc;i++)
printf("%s\n",argv[i]);
}
int main()
{
char var3[3][10]={"arg1","argument2","arg3"};
char var4[4][10]={"One","Two","Three","Four"};
fn(3,&var3);
fn(4,&var4);
return 0;
}
获得以下错误:
$ gcc -Wall anyNumberOfParameters.c -o anyNumberOfParameters.exe
anyNumberOfParameters.c: In function ‘main’:
anyNumberOfParameters.c:18:1: warning: passing argument 2 of ‘fn’ from incompatible pointer type [enabled by default]
fn(3,&var3);
^
anyNumberOfParameters.c:5:6: note: expected ‘char **’ but argument is of type ‘char (*)[3][10]’
void fn(int argc,char** argv)
^
anyNumberOfParameters.c:19:1: warning: passing argument 2 of ‘fn’ from incompatible pointer type [enabled by default]
fn(4,&var4);
^
anyNumberOfParameters.c:5:6: note: expected ‘char **’ but argument is of type ‘char (*)[4][10]’
void fn(int argc,char** argv)
^
如果我将main()
中的代码更改为:
char* var3[3]={"arg1","argument2","arg3"};
char* var4[4]={"One","Two","Three","Four"};
fn(3,var3);
fn(4,var4);
它工作正常,但我想知道如何将char[][]
作为参数传递。
char var[3][10]={"One","Two","Three"};
printf("%s",var[1]);
它会打印:Two
如果我将var
传递给char**
;它不等于二维数组的地址吗?
我的意思是我们传递的函数fn(char*)
:
char name[20]="Thomas";
fn(name);
char**
让我困惑
答案 0 :(得分:6)
如果您取消引用char **
,则应该获得指向char
的指针。 char[3][10]
中没有指针。它们只是不可互换。
它适用于一维char *
数组,因为数组名称隐式转换为指向此上下文中第一个元素的指针,如果取消引用char *
,则会得到char
这就是你的一维char
数组所包含的内容。
如果它适用于一维数组的思维方式,它不适用于二维数组?&#34;这里只是无效的。
要制作您想要做的工作,您必须创建char *
数组,如下所示:
#include <stdio.h>
void fn(int argc, char ** argv) {
printf("argc : %d\n", argc);
for (int i = 0; i < argc; ++i) {
printf("%s\n", argv[i]);
}
}
int main(void) {
char * var3[3] = { "arg1", "argument2", "arg3" };
char * var4[4] = { "One", "Two", "Three", "Four" };
fn(3, var3);
fn(4, var4);
return 0;
}
输出:
paul@local:~/src/c/scratch$ ./carr
argc : 3
arg1
argument2
arg3
argc : 4
One
Two
Three
Four
paul@local:~/src/c/scratch$
另一种方法是将您的函数声明为接受char
的10个元素数组(实际上是指针)的数组,如下所示:
#include <stdio.h>
void fn(int argc, char argv[][10]) {
printf("argc : %d\n", argc);
for (int i = 0; i < argc; ++i) {
printf("%s\n", argv[i]);
}
}
int main(void) {
char var3[3][10] = { "arg1", "argument2", "arg3" };
char var4[4][10] = { "arg1", "argument2", "arg3", "arg4" };
fn(3, var3);
fn(4, var4);
return 0;
}
但这显然需要硬编码除最左边之外的所有尺寸的尺寸,这通常不太理想和灵活。此处参数列表中的char argv[][10]
是撰写char (*argv)[10]
的另一种方式,即将argv
声明为指向大小为char
的{{1}}数组的指针。
答案 1 :(得分:1)
根据定义,type**
是指向指针或指针数组的指针。
在函数声明中使用type[][]
时,type**
具有int main(int argc, char argv[][]) { ...
的合格性,如下所示:
char var[a][b] = { ... }
但是在声明变量时却不是这样。当你这样做时:
char
这是char var[a*b]
的矩阵,这里没有指针。编译器几乎将此作为var[1][2]
的直接数组处理,当您访问var[1*b+2]
时,它在内部执行b
。它实际上不是一个字符串数组,只有在编译此函数时编译器知道char**
的值时才能使用它,因为变量是在那里声明的。
为了传递var
,char*
必须是一个指针数组。包含char *var[a] { ... }
。
执行此操作时:
var
现在你告诉编译者你的意图了。 char
不再是char*
的矩阵,它确实是一个指针列表{{1}}。