6

在我阅读的一些代码中,有一个像这样的初始化语句

char *array[]= { "something1", "something2", "something3" };

这是什么意思,该指针实际上指向什么?它是如何在内存中分配的,我如何访问该数组中的每个元素和元素的每个字符?

--- 已编辑 --- 请在这个例子中 char array[3]; 之间有什么区别?和 char *array[3]; --- 已编辑 ---

4

5 回答 5

8

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)

于 2013-01-28T20:20:29.490 回答
6

这是一种在创建数组的同时初始化数组的方法。

这段代码

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 的数组charchar *array[3];是一个由 3 个指针组成的数组char

于 2013-01-28T20:08:00.210 回答
4

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];
于 2013-01-28T20:10:38.203 回答
3

这定义了一个 char 指针数组(又名“c 字符串”)。

要访问您可以执行的内容:

for (int i=0; i<sizeof(array)/sizeof(char*); i++) {
    printf("%s", array[i]);
}
于 2013-01-28T20:10:23.727 回答
1

它声明array为一个由 3 个指向 的指针组成的数组char,其 3 个元素初始化为指向相应字符串的指针。内存分配给数组本身(3 个指针)和字符串。字符串内存是静态分配的。数组的内存是静态分配的(如果声明在所有函数之外)或动态分配(通常在 CPU 的执行堆栈上)如果声明在函数内部。

于 2013-01-28T20:09:59.540 回答