char *string1[20] = { "hello", "world" };
所以基于我的代码,我们可以用指针数组来做这个,但是对于单个数组,我们不能这样做。为什么我们不能在没有指针的情况下将多个字符串分配给1d数组?
在1d数组中,我们能够访问字符串中的每一个char。 那么,是否可以访问string1的单个值(例如我想在“世界”中访问'o')?
答案 0 :(得分:1)
是的,因为指针算法,可以将它用作2D数组:
#include <stdio.h>
int main() {
char *str[20] = {"hello", "world"};
printf("%c\n", str[1][1]);
return 0;
}
答案 1 :(得分:1)
每个字符串文字"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
中存储指向字符串文字的指针,而不是字符串本身的副本。字符串文字不可修改(尝试这样做会调用未定义的行为);如果你想能够修改字符串内容,请使用我上面显示的2D数组声明。
修改强>
在这里回答问题而不是评论,因为它不适合那里。
"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
的storead,而"world"
存储在地址0x8006
。字符数组arr
存储在地址0xff00
中,并包含字符串"hello"
的副本。指针p
存储在地址0xff08
,并存储字符串文字"world"
的第一个字符的地址。您应该能够找出parr
(这几乎就是您的原始代码段所做的事情)。
答案 2 :(得分:0)
是的,您可以直接访问它,如果您以前知道内部数组的大小,则可以使用通常的数组算法进行访问。
string1[1][1] == 'o'