char * a [] = {“ hello”,“ world”}有什么区别;和char a [] [10] = {“ hello”,“ world”};?

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

当我尝试此代码时

char *a[] = {"hello", "world" };
char **p = a;
char a[][10]={"hello", "world"};

我的编译失败,并且我被告知变量a存在类型冲突的错误。顶部声明与底部声明有何不同?

c arrays pointers declaration implicit-conversion
2个回答
4
投票

在第一个声明中

char *a[] = {"hello", "world" };

数组a具有类型char * [2]。数组的元素的类型为char *

[在表达式中用作初始化程序,例如,它隐式转换为指向其第一个具有char **类型的元素的指针,

所以这个声明

char **p = a;

是正确的。

此声明

char a[][10]={"hello", "world"};

声明类型为char [2][10]的数组。数组的元素的类型为char[10]

在表达式中使用,它隐式转换为指向类型为char ( * )[10]的第一个元素的指针。

所以指针的正确声明将是

char ( *p )[10] = a;

因此,数组的两个声明声明了不同类型的数组。

请注意,您不得使用第一个数组的元素(指针)来更改字符串文字。

在第二个声明中,文字的元素被复制到数组的元素中。由于数组没有限定符const,因此您可以更改存储的字符串。


4
投票

这里是内存布局的图片。这对应于代码:

char *a[2] = { "hello", "world" };
char **p = a;
char b[][10] = { "hello", "world" };
char **q = b;   // Error

Memory layout diagram

红色=字符数组,绿色=指针到字符,深绿色=指针到字符。

A char **(即指向char *的指针)只能指向char *变量,而不能指向char数组。

如您所见,称为char **p指向char *的存储。

但是q指向哪里?没有正确类型的变量。如果要直接指向bb的行,则需要一个指向char数组的指针(而不是指向char指针的指针)。

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