繁体   English   中英

char **是指向C中字符串数组的指针吗?

[英]Is char** a pointer to an array of strings in C?

据我了解, char* X是一个变量,它指向C中的单个字符或字符数组(字符串)。

char**是一个指向另一个指针的指针,该指针最终指向单个字符或字符数组。

如果int**等效于创建多维数组,为什么我不能使用char**在C中创建字符串数组?

const char** day = {
    "Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday"
};

这里的*day将指向数组本身,而**day将指向数组“ Sunday”的第一个元素?

为什么我不能使用char **在C中创建字符串数组? 是的,您可以创建。 正确的方法是使用char指针数组,而不是像以前那样使用double char**指针。 例如

const char* day[7] = {
    "Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday"
};

上面, day字符指针数组,其每个元素都是字符指针 ,每个元素都需要指向有效地址。 这里day[0]是字符指针,它指向字符串文字sunday ,即有效地址。

也可以通过char**但不能像您那样进行。 例如

char **day = {"sunday", "Monday" };

这里的问题是您没有为day[0]day[1]分配内存来保存一些字符串文字,例如sunday等等。

首先为如下所示的day分配内存

char **day = malloc(NUM_OF_DAYS * sizeof(*day)); /* define NUM_OF_DAYS as 7 */

然后为day[0]day[1]等分配内存。

for(int index =0 ; index < NUM_OF_DAYS; index++) {
   day[index] = malloc(MAX_DAY_SIZE * sizeof(**day)); /* define this MACRO */
}

然后在运行时扫描数据。

char* X是一个变量,它指向C中的单个字符或字符数组(字符串)。

不,它是一个包含单个字符地址的变量。 该单个字符可能是也可能不是以null结尾的字符串的开头。

因此, char**指向char*char*

如果int**等效于创建多维数组

它不是。 int**与多维数组无关。

为什么我不能使用char**在C中创建字符串数组?

因为char**不是数组,严格来说,它也不能指向一个数组。


char*可用于指向以空终止的字符串。 因此,如果您需要一个字符串数组,则需要一个char*数组。 例如,可以将其写为:

char* day[] = { ... };

事实证明,现在可以使用char**指向此数组的第一项 &day[0] ,因为它是char* 这通常会使人们混淆char**用于多维数组,因为这样做是有效的:

char* day[] = { "Sunday", ... };
char** week = &day[0];
printf("%c", week[0][0]); // prints 'S'

但这不会使char**成为数组,也不会使其成为2D数组。

您还可以使用char**动态分配字符串查找表,其中每个字符串的长度都可变:

char** week = malloc(7 * sizeof(char*));
for(int i=0; i<7; i++)
{
  week[i] = malloc( ... );
}

同样, char**指向一维char*数组的第一项。 不是 2D数组,也不指向1。 它允许week[i][j]语法无关紧要,它仍然不是数组(并且[]从未在数组类型上实际使用, 指针是否支持“数组样式索引”? )。

更多信息: 正确分配多维数组

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM