我对编程和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个星号。也许有人能给我提供更多关于这些关系的信息,以及这两个定义如何不同。
它们完全不同:
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;
}
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