如果我们创建一个char
数组:
char strings[3][10] = {"Apple","Banana","Grape"};
和char:
类型的指针char *pstrings[] = {"Apple","Banana","Grape"};
如果我们打印元素的地址,char数组元素将相隔10个字节,并且指针的元素似乎不会相互跟随。
如果元素在内存中没有相互跟随,你的程序如何知道在何处找到char指针的下一个元素?
答案 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'}
。
也知道一件事,第二种情况也是指针值存储在连续的内存中。