vas*_*cop 25 c string pointers initialization declaration
我总是这样宣告
char *c = "line";
Run Code Online (Sandbox Code Playgroud)
是一样的
char c[] = "line";
Run Code Online (Sandbox Code Playgroud)
所以我做到了
char **choices = { "New Game", "Continue Game", "Exit" };
Run Code Online (Sandbox Code Playgroud)
这给了我一个不兼容的指针类型,在哪里
char *choices[] = { "New Game", "Continue Game", "Exit" };
Run Code Online (Sandbox Code Playgroud)
没有.理解这个有什么帮助吗?
zwo*_*wol 16
char *c = "line";
Run Code Online (Sandbox Code Playgroud)
是不一样的
char c[] = "line";
Run Code Online (Sandbox Code Playgroud)
它真的是一样的
static char hidden_C0[] = "line";
char *c = hidden_C0;
Run Code Online (Sandbox Code Playgroud)
除了变量hidden_C0不能直接访问.但是如果你转储生成的汇编语言(它通常会有一个名称不是有效的C标识符,你会看到它.LC0).在你的array-of-string-constants示例中,同样的事情正在发生:
char *choices[] = { "New Game", "Continue Game", "Exit" };
Run Code Online (Sandbox Code Playgroud)
变
char hidden_C0[] = "New Game";
char hidden_C1[] = "Continue Game";
char hidden_C2[] = "Exit";
char *choices[] = { hidden_C0, hidden_C1, hidden_C2 };
Run Code Online (Sandbox Code Playgroud)
现在,这是一种特殊情况行为,仅适用于字符串常量.你不能写
int *numbers = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)
你必须写
int numbers[] = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)
这就是你不能写的原因
char **choices = { "a", "b", "c" };
Run Code Online (Sandbox Code Playgroud)
无论是.
(你的混乱是常见的误解的一种特殊情况,数组是"相同",在指针C.它们不是.数组的数组.与数组类型变量遭受型衰减到指针类型的时候都使用(几乎在每一个上下文),但不是在定义时.)
Wes*_*ker 13
嗯,他们不一样.大多数人认为它们是相同的更容易,所以每个人都开始这么想,直到遇到如上所述的问题:-)
我打算写一些长篇大论,但后来我想...其他人必须已经这样做了.他们有.这是一个很好的解释:
http://www.lysator.liu.se/c/c-faq/c-2.html
考虑它的最简单方法是,当您执行以下操作时:
char *foo = "something";
你真的在这样做:
char randomblob[] = "something"; char *foo = randomblob;
现在......这不是一个准确的图片(尽管我不是编译专家).它至少可以让你以更正确的方式思考问题.
所以,回到你的问题,如果我理解正确的事情(这是从来没有保证的),你不能做你的榜样线#3 C.你是对的,别人可以写一个编译器,它会在这里做正确的事,但是gcc没有.然而,第四个例子做了"正确的事情",并给你"一个指针数组,每个指针指向一个const char数组本身".
我曾经遇过一个将复杂的C类型翻译成英文的网页.这可能是在90年代初,但我敢打赌,如果你足够谷歌它会给你一个比我刚刚掀起的更准确的措辞描述.
没关系,就写
char **choices = (char *[]){ "New Game", "Continue Game", "Exit" };
但是,choices只能用于线性寻址。例如:
printf ("%s", &(*choices)[0]);输出:New Game
printf ("%s", &(*choices)[1]);输出:ew Game
printf ("%s", &(*choices)[9]);输出:Continue Game
因此,这不是开玩笑,而是有效的初始化。只是另一种用法。
您还可以在这里找到一个非常接近的示例,解释“ 复合文字”概念。