*[]和**之间的C差异

use*_*875 15 c arrays pointers

这可能是一个基本问题,但写char*[]和char**有什么区别?例如,在main中,我可以有一个char*argv [].或者我可以使用char**argv.我假设两种符号之间必须存在某种差异.

Jer*_*fin 20

在这种情况下,根本没有区别.如果您尝试使用数组类型作为函数参数,编译器将"调整"是为指针类型,而不是(即,T a[x] 作为函数参数意味着完全相同同样的事情:T *a).

在适当的情况下(即,作为函数参数),使用数组和指针表示法之间可能存在差异.一个常见的是extern声明.例如,假设我们有一个包含以下内容的文件:

char a[20];
Run Code Online (Sandbox Code Playgroud)

我们希望在另一个文件中显示它.这将有效:

extern char a[];
Run Code Online (Sandbox Code Playgroud)

但这不会:

extern char *a;
Run Code Online (Sandbox Code Playgroud)

如果我们改为使用指针数组:

char *a[20];
Run Code Online (Sandbox Code Playgroud)

...同样仍然正确 - 声明一个extern数组工作正常,但声明一个extern指针不会:

extern char *a[]; // works

extern char **a;   // doesn't work
Run Code Online (Sandbox Code Playgroud)


Ste*_*sop 9

取决于背景.

作为一个函数参数,它们对于编译器来说意味着相同的东西,但是编写它char *argv[]可能有助于使程序员明白char**传递指向数组的第一个元素char*.

作为变量声明,它们意味着不同的东西.一个是指针指针,另一个是指针数组,数组大小不明确.所以你可以这样做:

char * foo[] = {0, 0, 0};
Run Code Online (Sandbox Code Playgroud)

并获得3个空指针的数组.三个char*s与指向一个完全不同的东西char*.

  • Townsend:是的,`[]`形式强烈暗示它的目的是传递一个数组.不过,我不同意,`char**'意味着它'*不打算用作数组,因为有很多C程序员(包括我)不能被它打扰.`char*`通常不代表"只有一个字符" - 它通常用于字符串.我不明白为什么`char**`应该只是"一个`char*`".所以我会说'char**'表示"检查文档",而`char*[]`表示"检查文档";-) (3认同)

Laz*_*zer 5

您可以使用cdecl.org将它们转换为英语:

  • char *argv[]= 声明argv为 char 指针数组

  • char **argv= 声明argv为指向 char 的指针