一个元素的数组与一个对象的数组之间的区别?

问题描述 投票:-1回答:3

我想知道为什么显式地使用一个由一个元素对象组成的数组而不是直接实例化一个对象为什么有益。

例如,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
3个回答
1
投票

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

int a[1];

可能在使用以指针作为参数的函数时为方便起见。以函数memset()声明为:

void * memset (void *ptr, int value, size_t num );

如果声明单个变量并想在其上使用memset(),则必须将其称为:

int a;
memset(&a, val, sizeof(int));

如果您将a声明为int a[1],则将其称为:

memset(a, val, sizeof(int));

但是,以前的用途是做奇怪或不寻常的事情!


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版本中从技术上看这是非法的,因此可以使用长度为1的数组合法。但是据我所知,大多数编译器几乎永远都实现了0长度数组,因此大多数人可能会忽略它并使用0长度数组。


1
投票

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

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