char *string1[20] = { "hello", "world"};
所以根据我的代码,我们可以使用指针数组来做到这一点,但是对于单个数组,我们不能这样做。为什么我们不能将多个字符串分配给没有指针的一维数组?
在一维数组中,我们能够访问字符串中的每个字符。 那么,是否可以访问 string1 的单个值(例如我想访问“world”中的“o”)?
最佳答案
每个字符串文字 "hello"
和"world"
是 char
的数组,所以
char string1[20] = { "hello", "world" };
行不通;这和写作是一样的
int foo = { 1, 2 };
您正在尝试将 2 个东西存储到 1 个对象中。
您可以做几件不同的事情:
- 您可以将一个字符串存储到
string1
:char string1[20] = "hello"; // will copy the *contents* of "hello" into string1
- 您可以将两个字符串文字连接成一个字符串并将其存储在
string1
中。 :char string1[20] = "hello" " " "world"; // preprocessor concatenates adjacent string literals into a single string
- 您可以声明
string1
作为char
的二维数组:char string1[2][20] = { "hello", "world" }; // copies contents of "hello" to string1[0] and "world" to string1[1]
当前声明为string1
,您可以访问每个字符串文字的各个字符:
char *string1[20] = { "hello", "world" };
...
putchar( string1[1][1] ); // writes 'o' to standard output
请注意,在本例中,您将指向字符串文字的指针存储在 string1
中。 ,而不是字符串本身的副本。字符串文字不可修改(尝试这样做会调用未定义的行为);如果您希望能够修改字符串内容,请使用我上面显示的二维数组声明。
编辑
在这里回答问题而不是评论,因为它不适合那里。
"hello"
和"world"
是字符串文字;它们存储为 char
的数组这样它们在程序启动时分配,在程序退出时释放。两个文字都是“char
的 6 元素数组”类型的表达式(5 个字母加上 0 终止符)。
除非它是 sizeof
的操作数或一元 &
运算符,或者是用于在声明中初始化另一个数组的字符串文字,类型为“N
-T
的元素”的表达式将被转换(“衰减”)为“指向 T
的指针”类型的表达式。 "并且表达式的值将是数组第一个元素的地址。
示例:
char arr[6] = "hello";
这分配 arr
作为 char
的 6 元素数组并复制字符串 "hello"
到它;这与写作相同
char arr[6] = { 'h', 'e', 'l', 'l', 'o', 0 };
由于数组表达式 "hello"
用于初始化另一个数组 char
,它不会转换为指针表达式。
char *p = "world"
在本例中,分配 p
作为指向 char
的指针;它存储单个 char
的地址目的。由于字符串文字 "goodbye"
不是 sizeof
的操作数或一元 &
运算符,它会转换为 char *
类型的表达式,表达式的值为字符串中第一个字符的地址。
char *parr[2] = { "hello", "world" };
只分配足够的空间来存储两个指向char
的指针,不是两个字符数组。
如果我们查看上述所有内容的内存映射,我们会得到如下所示的内容(地址是凭空提取的,并不代表任何现实世界的平台;使用 16 位地址只是为了节省空间):
Item Address 00 01 02 03
---- ------- -- -- -- --
"hello" 0x8000 'h' 'e' 'l' 'l'
"world" 0x8004 'o' 0 'w' 'o'
0x8008 'r' 'l' 'd' 0
...
arr 0xff00 'h' 'e' 'l' 'l'
0xff04 'o' 0 ?? ??
p 0xff08 08 06 ?? ??
parr 0xff0c 08 00 08 06
字符串文字"hello"
存储在地址 0x8000
,而"world"
存储在地址 0x8006
。字符数组arr
存储在地址 0xff00
并包含字符串 "hello"
的副本 。指针p
存储在地址 0xff08
并存储字符串文字 "world"
的第一个字符的地址 。你应该能够算出parr
(这几乎就是您的原始代码片段正在做的事情)。
关于c - 数组到指针与二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36824206/