char **a与char *a[]的差异



我对编程和C一般来说是新的,过去几周我试图获得指针,数组以及它们如何连接的概念。目前我在C中实验命令行参数,我在这个平台上读到argv可以在语法上定义不同,但语义保持不变。

int main(int argc, char *argv[])

等于

int main(int argc, char **argv)

好吧,但是为什么当我尝试用这些方式初始化数组时,我的代码表现不同呢?

char *s[] = {"hallo", "12345"};
printf("%c und %c", s[0][4], s[1][2]);

我得到了预期的输出:0和3。

但是当我像

这样初始化数组时
char **s = {"hallo", "12345"};
printf("%c und %c", s[0][4], s[1][2]);

我得到一个分割错误或其他我无法理解的错误,如(接近初始化' s ')

我猜你不能初始化一个指针数组的2个星号。也许有人能给我提供更多关于这些关系的信息,以及这两个定义如何不同。

它们完全不同:

  1. char *s[]

是一个指针数组。数组不能被赋值或用作值

这段代码不能编译:

char *a[] = {"hallo", "12345"};
char *a1[2];
char **s = (char *[]){"hallo", "12345"};
char **s1;
void foo(void)
{
a++;
}
void bar(void)
{
a1 = a;
}
  1. char **s

是指向指针的指针,可以赋值或用作左值。

下面的代码将编译:

char *a[] = {"hallo", "12345"};
char *a1[2];
char **s = (char *[]){"hallo", "12345"};
char **s1;
void foo(void)
{
s++;
}
void bar(void)
{
s1 = s;
}

https://godbolt.org/z/vqxv913WY

相关内容

  • 没有找到相关文章

最新更新