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不同