const char ** name VS char * name []

Qui*_*rty 2 c arrays pointers char

我知道这个话题已经讨论了好几次了,我想我基本上知道数组和指针之间的区别,但是我对数组如何精确地存储在内存中很感兴趣。

例如:

const char **name = {{'a',0},{'b',0},{'c',0},0};
printf("Char: %c\n", name[0][0]); // This does not work
Run Code Online (Sandbox Code Playgroud)

但是,如果这样声明:

const char *name[] = {"a","b","c"};
printf("Char: %c\n", name[0][0]); // Works well
Run Code Online (Sandbox Code Playgroud)

一切正常。

Die*_*ühl 5

当你定义一个像

char const*  str = "abc";
char const** name = &str;
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

+---+     +---+    +---+---+---+---+
| *-+---->| *-+--->| a | b | c | 0 |
+---+     +---+    +---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

使用表格定义变量时

char const* name[] = { "a", "b", "c" };
Run Code Online (Sandbox Code Playgroud)

您有一个指针数组。看起来像这样:

          +---+     +---+---+
          | *-+---->| a | 0 |
          +---+     +---+---+
          | *-+---->| b | 0 |
          +---+     +---+---+
          | *-+---->| c | 0 |
          +---+     +---+---+
Run Code Online (Sandbox Code Playgroud)

可能令人困惑的是,当您将此数组传递到某个地方时,它衰减为一个指针,并且您得到了:

+---+     +---+     +---+---+
| *-+---->| *-+---->| a | 0 |
+---+     +---+     +---+---+
          | *-+---->| b | 0 |
          +---+     +---+---+
          | *-+---->| c | 0 |
          +---+     +---+---+
Run Code Online (Sandbox Code Playgroud)

也就是说,您将获得一个指向数组第一个元素的指针。递增此指针将移动到数组的下一个元素。