为数组中的第一个元素赋值时,为什么必须指定索引号? 假设我们有这个数组:
int childer[] = {10, 30, 50};
然后childer
和childer[0]
都会访问数组的第一个元素,为什么你不能childer = 15;
?
答案 0 :(得分:5)
数组类似于指针。例如,数组在传递给函数时衰减到指针,或者甚至在运算符[]
和一元*
应用于它们时(感谢StoryTeller)。所以
childer[0]
相当于
*childer
你可以做到
*childer = 15;
将第一个元素设置为15.
childer
另一方面,与
相同&childer[0]
答案 1 :(得分:0)
childer[0]
和childer
有两种不同的含义。 childer[0]
是数组的第一个元素,而childer
是指向第一个元素的指针。为了使用指针获取第一个元素,您必须使用*childer
。
所以,
*childer = 15;
可用于作业。
答案 2 :(得分:0)
您可以取消引用数组的名称,但只是尝试执行
childer = -999;
完全错了......
见下面的例子:
int main() {
int childer[] = { 10, 30, 50 };
cout << childer[0] << endl;
cout << *childer << endl;
//now write
childer[0] = 200;
cout << childer[0] << endl;
cout << *childer << endl;
//now write again
*childer = -999;
cout << childer[0] << endl;
cout << *childer << endl;
return 0;
}
答案 3 :(得分:0)
首先
int childer[] = { 10, 20, 30 };
...
childer = ....; <--- THIS WILL NOT COMPILE, as childer is not an lvalue.
您不能说childer = 20;
,您可以说childer[0] = 20;
或*childer = 20;
,或者更多*(childer + 1) = 20;
(访问除第一个之外的其他元素),但您不能使用{ {1}}作为赋值中的整个数组。简单来说, C 和 C ++ 都不允许这样做。
数组和指针是非常不同的东西。让你困惑的是, C , C ++ 都没有办法引用数组作为一个整体,数组标识符本身表示第一个元素的地址(而不是指针而是引用)。我的意思是一个引用,而我现在不使用单词指针,是指针通常是指一个指针类型的变量,并且作为变量,可以修改(主要是因为在运行时不能更改数组位置)。当childer
是一个数组时,你不能写array = something_else;
之类的东西。数组名称不能单独用作左值,仅作为右值。这可以通过指针来完成,比如
array
然后
int childer[] = { 10, 20, 30, };
int *pointer = childer;
因为pointer = some_other_place_to_point_to;
是一个指针而且pointer
不是。
这两种语言属于数组名称的含义只是指向第一个元素的地址的指针rvalue(并键入为单元格类型,继续阅读以获得对此的解释)。这与第一个数组的地址(两者都是不同的东西,如下所示)不同(数组名称是指向单元格类型的指针,而数组地址childer
是指向整体的指针数组类型)。这可以通过下一个程序来说明,它试图向您展示数组元素,整个数组,数组指针和单元格指针的大小差异:
&childer
执行(我选择#include <stdio.h>
#include <sys/types.h>
#define D(x) __FILE__":%d:%s: " x, __LINE__, __func__
#define P(fmt, exp) do { \
printf(D(#exp " == " fmt "\n"), (exp)); \
} while(0)
#define TR(sent) \
sent; \
printf(D(#sent ";\n"))
int main()
{
int i = 1;
TR(double a[10]);
P("%p", a);
P("%p", &a);
P("%d", sizeof a);
P("%d", sizeof &a);
P("%d", sizeof *a);
P("%d", sizeof *&a);
return 0;
}
作为单元格类型,以便在尝试更多独立于架构时明显区别对象):
double
但是当你说你不能使用表达式来访问其他元素时,你错了,你可以使用$ pru
pru.c:16:main: double a[10]; <-- array of ten double's (a double is 8 bytes in many architectures)
pru.c:18:main: a == 0xbfbfe798 <-- address values are
pru.c:19:main: &a == 0xbfbfe798 <-- equal for both.
pru.c:20:main: sizeof a == 80 <-- size of whole array.
pru.c:21:main: sizeof &a == 4 <-- size of array address (that's a pointer to array)
pru.c:22:main: sizeof *a == 8 <-- size of pointed cell (first array element)
pru.c:23:main: sizeof *&a == 80 <-- size of pointed array.
来表示第二个元素的地址,并使用array + 1
来访问地址array + n
元素。显然n + 1
与array + 0
相同(array
数字在指针添加中也是中性的),因此您可以轻松地使用它。有些人喜欢把它写成为0
(为了滥用0+array
运算符的交换性)并进一步编写类似+
之类的内容来引用第一个元素数组(这次是对元素的访问,而不是对它的地址的访问)我不知道这是否继续对新标准有效,但我担心它可能继续允许遗留代码可编译(增加了应该保留的内容和标准修订版本可以消除的内容的争议)