C中char *类型元素的地址

时间:2018-01-06 07:34:56

标签: c arrays pointers

如果我们创建一个char数组:

char strings[3][10] = {"Apple","Banana","Grape"};

和char:

类型的指针
char *pstrings[] = {"Apple","Banana","Grape"};

如果我们打印元素的地址,char数组元素将相隔10个字节,并且指针的元素似乎不会相互跟随。

如果元素在内存中没有相互跟随,你的程序如何知道在何处找到char指针的下一个元素?

1 个答案:

答案 0 :(得分:7)

您正在使用该信息初始化char*数组。

实际上char*[]包含指向相应字符串文字的单个char*。它是怎么来的?好"abc"基本上是一个空终止的char数组,它衰变成指向数组的第一个元素'a'的指针,现在如果已知它并不难访问它们。地址基本上都是存储的。在第二种情况下,您正在使用这些值初始化char*数组。这些字符串文字不必来自连续的内存。

          +-+-+-+-+-+      +-+-+-+-+-+-+      +-+-+-+-+-+
ADDRESS   |Random   |      |Random     |      |Random   |
          +-+-+-+-+-+      +-+-+-+-+-+-+      +-+-+-+-+-+
          |A|p|p|l|e|      |B|a|n|a|n|a|      |G|r|a|p|e|
          +-+-+-+-+-+      +-+-+-+-+-+-+      +-+-+-+-+-+
                     \           |           /
                      \          |          /
                       \         |         /
                        +-+-+-+-+-+-+-+-+-+
                        |  0  |  1  |  2  |
                        +-+-+-+-+-+-+-+-+-+

这就是为什么在打印strings[0]strings[1]等时获得不同值的原因

程序只使用存储在pstrings中的初始化值,并包含这些字符串文字的地址。这就是我们如何使用它。

在第一种情况下,与字符串文字相同的内容 - 我们正在char数组中初始化它们,而这些数组又是连续的。

          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
ADDRESS   |strings + 0        |strings + 10       |strings + 20       |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
          |A|p|p|l|e| | | | | |B|a|n|a|n|a| | | | |G|r|a|p|e| | | | | |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
          |         0         |         1         |         2         |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +

因此,我们可以将那些可修改的字符串分别存储在10 char的数组中。 char p[]="abc";相当于此char p[]={'a','b','c','\0'}

也知道一件事,第二种情况也是指针值存储在连续的内存中。

  1. 这些精彩的ascii-art说明由Keine Lust提供。