我想知道是否有理由使用由一个元素对象组成的数组,而不是仅使用一个对象。
例如,f.e。
int a[1] = {10};
而不是公正
int a = 10;
当然,在两种情况下,通过使用10
来访问后面代码中的a
的值有很大的不同:
a
声明为数组时,例如int a[1] = {10};
[a
衰减为指向a
数组的第一个元素对象的指针,因此,当稍后在程序中使用a
时,int*
的类型为a
。
a
被声明为某个对象的标识符时,例如int a = 10;
[a
的类型为int
。
如果要将10
的值传递给函数,则必须注意这一点,并且必须区分这两种用法。
但是那不能回答我为什么使用一种方法而不是另一种方法的问题。
使用C和C ++进行标记的原因:我用两种语言标记来标记它,因为这两种语句在C和C ++中都是有效的,并且在目前,我不知道在那种情况下两种语言之间的任何区别。如果有区别,请注意。
感谢您的帮助。
C和/或C ++中是否有需要数组而不是仅一个对象的地方?
[我认为您通常会遇到带有一个对象的C样式数组,作为对一个对象的递归函数的结尾。如果您有一个函数以类似C的方式接受数组(f(int* array, int length)
),则可以使用此函数将该函数仅应用于一个输入,而无需提供另一个重载。但是您可以使用int a = 42; f(&a, 1);
执行相同的操作。
内存中的分配大小是否存在物理差异?
没有int a[1] = {42}
和int a = 42
对堆栈的作用完全相同。
C和C ++在这方面是否有所不同?
没有
为什么我使用一个元素数组而不是一个对象数组?
一个编译时大小为1的数组(就像您在上面所做的那样)可能很少使用。之间的区别>>
中的区别很小。我可以想象,如果有人想在堆栈上初始化一个对象并直接拥有一个指向它的指针(而不真正使用该值本身),那么它会做的第一件事,因为它要短一些。但是我从来没有见过我自己,我实际上会认为这是不好的风格。我认为这在C ++代码中非常罕见,因为原始指针本身并不常见。int a[1] = {42}; // and int b = 42; int *a = &b;
因为数组不是指针,而是仅衰减为一个。但是using
实际上,我经常看到长度为0的数组,请参见用法here。由于那些似乎在C的较旧版本中在技术上是非法的
有时,为常见情况编写的函数将意味着采用数组,例如,在C语言中,您可能会遇到类似这样的事情:
我认为声明一个对象的数组毫无意义。我强烈建议您使用基本的:a = 10 ;
C和/或C ++中是否有需要数组而不是仅一个对象的地方?
您不应声明由一个对象组成的数组。如果您只需要一个变量,则可以这样声明。但是要回答您的问题,您可能想写一些类似的东西:
没有理由使用int a[1];
代替int a;
。需要时使用&a
将指针传递给它。如果您曾经写过int a[1];
,其他人会非常困惑-它看起来像个bug。