选择一个元素而不是一个对象的数组的原因?

问题描述 投票:0回答:6

我想知道是否有理由使用由一个元素对象组成的数组,而不是仅使用一个对象。

例如,f.e。

int a[1] = {10};

而不是公正

int a = 10;

当然,在两种情况下,通过使用10来访问后面代码中的a的值有很大的不同:

  1. [将a声明为数组时,例如
int a[1] = {10};

[a衰减为指向a数组的第一个元素对象的指针,因此,当稍后在程序中使用a时,int*的类型为a

  1. a被声明为某个对象的标识符时,例如
int a = 10;

[a的类型为int

如果要将10的值传递给函数,则必须注意这一点,并且必须区分这两种用法。

但是那不能回答我为什么使用一种方法而不是另一种方法的问题。


  • 在C和/或C ++中是否有需要数组而不只是一个对象的地方?
  • 内存中的分配大小是否存在物理差异?
  • C和C ++在这方面是否有所不同?
  • 是否有理由选择一个元素而不是一个对象的数组?

使用C和C ++进行标记的原因:我用两种语言标记来标记它,因为这两种语句在C和C ++中都是有效的,并且在目前,我不知道在那种情况下两种语言之间的任何区别。如果有区别,请注意。

感谢您的帮助。

c++ c arrays object difference
6个回答
1
投票

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的数组(就像您在上面所做的那样)可能很少使用。之间的区别>>

int a[1] = {42};
// and
int b = 42;
int *a = &b;

因为数组不是指针,而是仅衰减为一个。但是using

中的区别很小。我可以想象,如果有人想在堆栈上初始化一个对象并直接拥有一个指向它的指针(而不真正使用该值本身),那么它会做的第一件事,因为它要短一些。但是我从来没有见过我自己,我实际上会认为这是不好的风格。我认为这在C ++代码中非常罕见,因为原始指针本身并不常见。

实际上,我经常看到长度为0的数组,请参见用法here。由于那些似乎在C的较旧版本中在技术上是非法的

在C中无效(注释为thx),因此可以使用长度为1的数组合法。但是据我所知,大多数编译器几乎永远都实现了0长度数组,因此大多数人可能会忽略它并使用0长度数组。

1
投票

有时,为常见情况编写的函数将意味着采用数组,例如,在C语言中,您可能会遇到类似这样的事情:


1
投票

我认为声明一个对象的数组毫无意义。我强烈建议您使用基本的:a = 10 ;


1
投票

C和/或C ++中是否有需要数组而不是仅一个对象的地方?


0
投票

您不应声明由一个对象组成的数组。如果您只需要一个变量,则可以这样声明。但是要回答您的问题,您可能想写一些类似的东西:


0
投票

没有理由使用int a[1];代替int a;。需要时使用&a将指针传递给它。如果您曾经写过int a[1];,其他人会非常困惑-它看起来像个bug。

© www.soinside.com 2019 - 2024. All rights reserved.