在我阅读的一些代码中,有一个像这样的初始化语句
char *array[]= { "something1", "something2", "something3" };
这是什么意思,该指针实际上指向什么?它是如何在内存中分配的,我如何访问该数组中的每个元素和元素的每个字符?
--- 已编辑 --- 请在这个例子中 char array[3]; 之间有什么区别?和 char *array[3]; --- 已编辑 ---
在我阅读的一些代码中,有一个像这样的初始化语句
char *array[]= { "something1", "something2", "something3" };
这是什么意思,该指针实际上指向什么?它是如何在内存中分配的,我如何访问该数组中的每个元素和元素的每个字符?
--- 已编辑 --- 请在这个例子中 char array[3]; 之间有什么区别?和 char *array[3]; --- 已编辑 ---
what that means ?
It's initializing an array of strings (char *
) with three values (three pointers to null-terminating strings)
and what that pointer points to ?
It should point to the first element in the char*
array
how is that allocated in memory ?
It will allocate enough memory to store the three strings followed by null-terminators, as well as the three pointers to those strings:
array --> pointer to three sequential memory addresses
array[0] --> something1{\0}
array[1] --> something2{\0}
array[2] --> something3{\0}
Note that the strings may not necessarily be in sequential memory
and how can I access every element
if by "element" you mean the string, you can loop though the pointers:
for(int i=0; i<3; i++)
{
char* element = array[i];
}
and every character of an element in that array
well, you could access the chars using array syntax (element[i]
) but I would recommend using the C string functions for safety (so you don't have to worry about accessing memory outside the range of the string)
这是一种在创建数组的同时初始化数组的方法。
这段代码
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];
是一个由 3 个指针组成的数组char
。
char *
在 C 中是一个字符串。
array
是被声明的变量的名称。
[]
表示它是一个数组。
{ "something1", "something2", "something3" }
正在初始化数组的内容。
访问元素是这样完成的:
array[0]
给出第一个元素 - “something1”。
array[1]
给出第二个元素 - “something2”。
等等
笔记:
正如评论中指出的那样,从char *
技术上讲,它不是一个字符串。
它是指向 a 的指针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];
这定义了一个 char 指针数组(又名“c 字符串”)。
要访问您可以执行的内容:
for (int i=0; i<sizeof(array)/sizeof(char*); i++) {
printf("%s", array[i]);
}
它声明array
为一个由 3 个指向 的指针组成的数组char
,其 3 个元素初始化为指向相应字符串的指针。内存分配给数组本身(3 个指针)和字符串。字符串内存是静态分配的。数组的内存是静态分配的(如果声明在所有函数之外)或动态分配(通常在 CPU 的执行堆栈上)如果声明在函数内部。