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

时间:2019-04-30 02:44:53

标签: c arrays pointers

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

为什么不能使用char **在C中创建字符串数组?是的,您可以创建正确的方法是使用字符指针数组,而不是像以前那样使用双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 */
}

然后在运行时扫描数据。

答案 1 :(得分:1)

  

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

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

因此char**指向一个char*,它指向一个字符。

  

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

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

  

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

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


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

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

现在事实证明,char**可用于指向此数组&day[0]第一项的地址,因为那是{{ 1}}。这常常使人们对多维数组的char*感到困惑,因为这样做是有效的:

char**

但这不会使char* day[] = { "Sunday", ... }; char** week = &day[0]; printf("%c", week[0][0]); // prints 'S' 成为数组,也不会使其成为2D数组。

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

char**

这里,char** week = malloc(7 * sizeof(char*)); for(int i=0; i<7; i++) { week[i] = malloc( ... ); } 再次指向char**一维数组的第一项。它不是2D数组,也不指向一个。允许char*语法是无关紧要的,它仍然不是数组(并且week[i][j]从未真正用于数组类型Do pointers support “array style indexing”?)。

更多信息:Correctly allocating multi-dimensional arrays