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

问题描述 投票:0回答:2

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

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

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

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

这里*day指向数组本身,**day指向数组“星期日”的第一个元素?

c arrays pointers
2个回答
1
投票

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

不,它是一个包含单个字符地址的变量。该单个字符可能是也可能不是空终止字符串的开头。

因此,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**成为一个数组,也不会使它成为一个二维数组。

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

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

再次,char**指向char*的一维阵列的第一项。它不是2D阵列,也不是一个。它允许week[i][j]语法是无关紧要的,它仍然不是一个数组(并且[]实际上从未在数组类型上使用,Do pointers support “array style indexing”?)。

更多信息:Correctly allocating multi-dimensional arrays


4
投票

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

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

上面,day是char指针数组,它的每个元素都是字符指针,每个元素都需要指向有效地址。这里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 */
}

然后在运行时扫描数据。

© www.soinside.com 2019 - 2024. All rights reserved.