为数组中的第一个元素赋值时,为什么必须指定索引号?

时间:2017-06-19 10:12:38

标签: c++ c

为数组中的第一个元素赋值时,为什么必须指定索引号? 假设我们有这个数组:

int childer[] = {10, 30, 50};

然后childerchilder[0]都会访问数组的第一个元素,为什么你不能childer = 15;

4 个答案:

答案 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 + 1array + 0相同(array数字在指针添加中也是中性的),因此您可以轻松地使用它。有些人喜欢把它写成为0(为了滥用0+array运算符的交换性)并进一步编写类似+之类的内容来引用第一个元素数组(这次是对元素的访问,而不是对它的地址的访问)我不知道这是否继续对新标准有效,但我担心它可能继续允许遗留代码可编译(增加了应该保留的内容和标准修订版本可以消除的内容的争议)