在我读过的一些代码中,有一个像这样的初始化语句
char *array[]= { "something1", "something2", "something3" };
这意味着什么,指针实际指向的是什么? 如何在内存中分配,以及如何访问该数组中元素的每个元素和每个字符?
---编辑--- 请问这个例子之间的区别是什么 char数组[3]; 和 char * array [3]; ---编辑---
答案 0 :(得分:5)
这意味着什么?
它正在初始化一个包含三个值的字符串数组(char *
)(三个指向空终止字符串的指针)
以及指针指向的是什么?
它应指向char*
数组
如何在内存中分配?
它将分配足够的内存来存储三个字符串,后跟null-terminators,以及指向这些字符串的三个指针:
array --> pointer to three sequential memory addresses
array[0] --> something1{\0}
array[1] --> something2{\0}
array[2] --> something3{\0}
请注意,字符串可能不一定在顺序存储器中
以及如何访问每个元素
如果用“element”表示字符串,你可以通过指针循环:
for(int i=0; i<3; i++)
{
char* element = array[i];
}
和该数组中元素的每个字符
好吧,你可以使用数组语法(element[i]
)访问字符,但我建议使用C string functions来保证安全(所以你不必担心访问范围之外的内存)字符串)
答案 1 :(得分:4)
这是一种在创建数组的同时初始化数组的方法。
此代码
char *array[]= { "a", "b", "c" };
将与此代码具有相同的结果。
char *array[3];
array[0] = "a";
array[1] = "b";
array[2] = "c";
这是获取更多信息的良好来源。
http://www.iu.hio.no/~mark/CTutorial/CTutorial.html#Strings
编辑:
char array[3];
是一个3 char
的数组。
char *array[3];
是一个包含char
的3个指针的数组。
答案 2 :(得分:3)
char *
是一个字符串。
array
是要声明的变量的名称。
[]
表示它是一个数组。
{ "something1", "something2", "something3" }
正在初始化数组的内容。
访问元素的方式如下:
array[0]
给出第一个元素 - “something1”。
array[1]
给出第二个元素 - “something2”。
等
注意:强>
正如评论中指出的那样,char *
在技术上并不是一个字符串。
这是指向char
的指针。您可以在内存中可视化字符串,如下所示:
<-------------------------->
..134|135|136|137|138|139|..
<-------------------------->
'H'|'e'|'l'|'l'|'o'|'\0'
<-------------------------->
这个内存块(位置134-139)保存着字符串。
例如:
array[0]
实际上返回指向“something1”中第一个字符的指针。
您使用以下事实:字符在内存中按顺序以各种方式访问字符串的其余部分:
/* ch points to the 's' */
char* ch = array[0];
/* ch2 points to the 'e' */
char* ch2 = ch + 3;
/* ch3 == 'e' */
char ch3 = *ch2;
/* ch4 == 'e' */
char ch4 = *(ch + 3);
/* ch5 == 'e' */
char ch5 = ch[3];
答案 3 :(得分:2)
这定义了一个char指针数组(又名“c strings”)。
要访问您可以执行的内容:
for (int i=0; i<sizeof(array)/sizeof(char*); i++) {
printf("%s", array[i]);
}
答案 4 :(得分:0)
它将array
声明为一个指向char
的3个指针的数组,其3个元素初始化为指向各个字符串的指针。内存是为数组本身(3个指针)和字符串分配的。字符串内存是静态分配的。如果声明在函数内部,则静态分配数组的内存(如果声明在所有函数之外)或动态地(通常在CPU的执行堆栈上)分配。