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

C++ 为数组中的第一个元素赋值时,为什么必须指定索引号?,c++,c,C++,C,为数组中的第一个元素赋值时,为什么必须指定索引号? 假设我们有一个数组: int childer[] = {10, 30, 50}; 然后childer和childer[0]都将访问数组的第一个元素,那么为什么不能执行childer=15?数组类似于指针。例如,当一个数组被传递到一个函数时,或者甚至当操作符[]和一元数*被应用到它们时,数组会衰减为指针(感谢StoryTeller)。所以 相当于 *childer 你能做到吗 *childer = 15; 将第一个元素设置为15 另一方面

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

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

然后
childer
childer[0]
都将访问数组的第一个元素,那么为什么不能执行
childer=15

数组类似于指针。例如,当一个数组被传递到一个函数时,或者甚至当操作符
[]
和一元数
*
被应用到它们时,数组会衰减为指针(感谢StoryTeller)。所以

相当于

*childer
你能做到吗

*childer = 15;
将第一个元素设置为15


另一方面与

&childer[0]

数组类似于指针。例如,当一个数组被传递到一个函数时,或者甚至当操作符
[]
和一元数
*
被应用到它们时,数组会衰减为指针(感谢StoryTeller)。所以

相当于

*childer
你能做到吗

*childer = 15;
将第一个元素设置为15


另一方面与

&childer[0]

childer[0]
childer
有两种不同的含义
childer[0]
是数组的第一个元素,而
childer
是指向第一个元素的指针。要使用指针获取第一个元素,必须使用
*childer

所以


可用于作业。

childer[0]
childer
有两种不同的含义
childer[0]
是数组的第一个元素,而
childer
是指向第一个元素的指针。要使用指针获取第一个元素,必须使用
*childer

所以


可以用于赋值。

您可以取消对数组名称的引用,但只需尝试

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;
}
intmain(){
int childer[]={10,30,50};

cout您可以取消对数组名称的引用,但只需尝试

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;
}
intmain(){
int childer[]={10,30,50};
首先不能

int childer[] = { 10, 20, 30 };
...
childer = ....; <--- THIS WILL NOT COMPILE, as childer is not an lvalue.
然后

pointer = some_other_place_to_point_to;
因为
pointer
是指针,
childer
不是指针

这意味着数组名的两种语言属性只是指向第一个元素地址的指针rvalue(并键入为单元格类型,请继续阅读以了解有关说明)。这与第一个元素的数组地址不同(两者都是不同的东西,如下所示)(数组名称是指向单元格类型的指针,而数组地址
&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;
}
但是当你说不能使用表达式访问其他元素时,你是错的,因为你可以使用
array+1
表示第二个元素的地址,使用
array+n
访问
n+1
元素的地址。显然
array+0
array
相同(在指针加法中,
0
数字也是中性的),因此您可以很容易地使用它。有些人喜欢将其作为
0+数组
(滥用
+
运算符的可交换性)编写,并进一步编写类似于
0[array]
,以引用数组的第一个元素(这次是对元素的访问,而不是对其地址的访问)我不知道这在新标准中是否仍然有效,但我担心它可能会继续允许遗留代码可编译(增加了关于什么应该保存,什么可以在标准修订中消除的争议)

首先

int childer[] = { 10, 20, 30 };
...
childer = ....; <--- THIS WILL NOT COMPILE, as childer is not an lvalue.
然后

pointer = some_other_place_to_point_to;
因为
pointer
是指针,
childer
不是指针

这意味着数组名的两种语言属性只是指向第一个元素地址的指针rvalue(并键入为单元格类型,请继续阅读以了解有关说明)。这与第一个元素的数组地址不同(两者都是不同的东西,如下所示)(数组名称是指向单元格类型的指针,而数组地址
&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;
}

但是当你说不能使用表达式访问其他元素时,你是错的,因为你可以使用
array+1
表示第二个元素的地址,使用
array+n
访问
n+1
元素的地址。显然
array+0
array
相同(在指针加法中,
0
数字也是中性的),因此您可以很容易地使用它。有些人喜欢将其作为
0+数组
(滥用
+
运算符的可交换性)编写,并进一步编写类似于
0[array]
,以引用数组的第一个元素(这次是对元素的访问,而不是对其地址的访问)我不知道这在新标准中是否仍然有效,但我担心它可能会继续允许遗留代码可编译(增加了关于什么应该保留,什么可以在标准修订中消除的争议)

你怎么说childer将访问数组的第一个元素?它将被计算到第一个元素,对吗@Angew@Jake不,不会。数组是数组,元素是元素。不。它将是指向第一个元素的指针。与t不同