传递char **参数char [] []数组:C

时间:2014-05-25 19:38:18

标签: c

对于以下代码,如何将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**让我困惑

2 个答案:

答案 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**的值时才能使用它,因为变量是在那里声明的。

为了传递varchar*必须是一个指针数组。包含char *var[a] { ... }

指针的列表

执行此操作时:

var

现在你告诉编译者你的意图了。 char不再是char*的矩阵,它确实是一个指针列表{{1}}。