我想知道为什么第一个语句有效,为什么不能用c ++中的第二个语句
char a[10]="iqbal"; // it works
a="iqbal"; // does not work
答案 0 :(得分:22)
严格来说,数组不是指针! 并且数组(数组的基地址)不能是可修改的左值 。即,它不能出现在赋值运算符的左侧。仅在某些情况下才会将衰减变为指针。阅读此SO post以了解数组何时衰减为指针。还有一个nice article解释了数组和指针之间的差异
另请阅读关于左值和右值here的内容,以便了解=
char a [10] =“iqbal”; //它有效吗
在这种情况下,内部发生的事情是
a[0] = 'i';
a[1] = 'q';
.
.
a[5] = '\0';
所以一切都很好,因为array[i]
是一个可修改的左值。
α= “伊克巴尔”; //不起作用
在内部,这大致相当于
0x60000(Address of a, but is a simple number here ) = Address of "iqbal"
这是错误的,因为我们无法为数字分配内容。
答案 1 :(得分:5)
char数组a将是静态的,如果像这样初始化它就无法更改。无论如何,你永远不能在c中分配字符串a =“iqbal”。你必须使用strncpy或memcpy。否则你会尝试覆盖指向字符串的指针,这不是你想要的。
所以正确的代码会做类似的事情:
char a[10];
strncpy(a, "iqbal", sizeof(a) - 1);
a[sizeof(a) - 1] = 0;
-1是为终止零保留一个字节。注意,如果字符串为null,则必须自行检查。坏api。有一个strlcpy()调用可以为你执行此操作,但它不包含在glibc中。
答案 2 :(得分:3)
第一行不是语句,而是具有初始化的声明。 第二行是带赋值运算符的表达式语句。
您无法在C中分配数组。
但您可以使用字符串文字的元素初始化数组。
答案 3 :(得分:1)
因为它们是不同的陈述,几乎完全无关。不要因为它们都使用为什么第一个语句有效,为什么不在c ++中使用第二个语句
=
符号而感到困惑。在一种情况下,它表示对象初始化。在另一种情况下,赋值运算符。
您的第一行是合法的,因为初始化聚合(包括字符数组)是合法的。
您的第二行不合法,因为分配给数组是不合法的。
由于这是C ++,我可以建议您避免使用裸阵列吗?对于字符串,请使用std::string
。对于其他阵列,请使用std::vector
。如果你这样做,你的例子就变成了:
std::string a = "iqbal"; // it works
a="iqbal"; // so does this
答案 4 :(得分:0)
写作时 char a [10] =" iqbal" 您正在使用字符初始化字符数组 a 的元素。我们可以使用 int 类型执行相同操作(请注意 char 类型的处理稍有不同): int a [10] = {1,2,...};
但是在声明部分之后写下面的内容将无效,因为 a 将被视为指针。所以写点像 A = {1,2,...}; 或者a =" iqbal" 没有任何意义!
答案 5 :(得分:0)
尝试:
char a[10]="iqbal";
char *my_a = a;
并使用my_a。
答案 6 :(得分:0)
在 C++11 中,您可以使用 lambda 进行初始化,如下所示:
bool test = true;
/*const*/ char a[10] = { //Aggregate initialization
[=] //capture by value
()//no parameters
{ //start lambda
switch (test) {
case true: return *"test=true"; //*"xxx" don't return a pointer, but the 'string' itself
case false: return *"test=false";
} //switch
}()}; //}, close the lambda, (), call it, }; close aggregate initialization
当您的环境不支持 std::string
时,这会派上用场,例如 NVidia 的 CUDA 或一些奇怪的嵌入式环境。
lambda 被内联,所以在内部它转换为 char a[10] = test?"xxx":"yyy";
如果您可以选择这样做,您显然希望始终使用 std::string
,因为固定大小的字符缓冲区从根本上说是个坏主意。
如果您使用 std::string
,您可以使用以下命令将其转换为字符数组:chararray = mystring.c_str();
。如果您坚持使用 printf
: printf("s = %s", mystring.c_str());
,这很有用。