用括号或星号在c++中声明一个双数组

Declaring a double array in c++ using brackets or asterisk

本文关键字:数组 一个 c++ 声明      更新时间:2023-10-16

具有如下声明的变量:

双*变量;

我认为这和写差不多

双变量[];

然后介绍了一些工作方法;

如何可能获得二重数组的长度?我的意思是,我如何知道variable的最后一个内化/访问/写入元素位于哪个位置?

主要区别在于:

  • double* variable;是指在执行过程中动态分配的指针(例如通过newmalloc(,也可以指向双对象(那么,它不是"数组"(
  • double variable[];是一个静态分配的数组(因此它的大小是在编译过程中定义和固定的(。请注意,double variable[];作为声明无效。必须指定数组的大小(例如double variable[20];(

要回答您的问题:您无法确定double*double[]变量的元素数,除非您自己将其保存在某个位置。

例如,如果要将double*对象传递给函数,则需要同时传递指针和大小(元素数(。则函数proptotype为( double* data, size_t size )

size_t mySize = 20;
double* data = new double[20];
callFunc( data, mySize );
delete [] data; // need to be deleted because dynamically allocated

或:

static const size_t mySize = 20;
double data[mySize];
callFunc( data, mySize );
// no need to be deleted because statically allocated

正如其他用户所评论的那样,更喜欢封装双*指针及其元素数量(以及其他属性(的std::vector:

std::vector<double> data;
data.assign( 20, 0.0 );
callFunc( data );

CCD_ 11然后可以使用CCD_ 12访问数据值并知道其大小。

注意:对于char*,约定是以一个特殊字符((结束字符串,因此,在这种情况下,您可以通过查找这个特殊字符来确定char数组的size(strlen就是这样做的(。你可以用双*指针做类似的事情(比如用NaN来识别最后一个项目,然后恢复数组大小(,但这只是一个破解,既不传统,也不推荐。

让我纠正一下。

double* foo;

声明一个指向双精度的指针,名为foo。

double foo[] = {1.1, 2.2, 3.3};

声明一个名为foo的double数组,尚未为其分配内存。C++的C根的剩余部分是数组可以衰减到指针。因此可以执行以下操作:

double foo[] = {1.1, 2.2, 3.3};
double bar* = foo[0];  // bar now points to the first element of foo.

但这并不意味着foo和bar是一回事。您可以使用指针来迭代c数组的内容(假设您知道大小(,但在某些细微的区域,差异可能会让您感到困惑(例如下面(。

你也可以做一些类似的事情:

double *foo;
// call something that allocates memory for an array and assigned the address of the first element to foo.

但在这种情况下,您将不得不自己跟踪数组大小。这就是为什么在C++中,如果你使用静态分配的数组,你应该更喜欢std::array,如果你正在使用动态分配的数组时,你应该喜欢std::vector,因为这些类会比你可能处理的更好地处理细节

有一种可爱的方法,我不建议你使用,但它说明了double*和double-foo[]之间的区别,Scott Meyers在"有效的现代C++"中谈到了这一点:

template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&)[N]) noexcept
{
    return N;
}
double foo[] = {1.1, 2.2, 3.3};
constexpr int array_size = arraySize(foo);

将创建一个具有3个双精度的c数组,并将const_expr(它可能是一个变量,我使用const_expr来明确表示这是在编译时推导出来的(array_size初始化为数组的大小。

但如果可以的话,请避免所有这些,并在可以的时候使用std::array和std::vector。

指针不是数组。

下面的代码是一个4大小的数组:

double arr[] {1.1, 1.2, 1.3, 1.4};

arr指的是存储器块,例如:

0x22fe20 | 0x22fe28 | 0x22fe30 | 0x22fe38 | 0x22fe40

而下面是指向arr开头的地址:

double *p_arr {arr};

如何可能获得二重数组的长度?

要获得尺寸,可以取arr的尺寸,并通过第一个元素的大小:

size_t arr_len = (sizeof(arr) / sizeof(*arr));

然后,我们知道最后一个初始化的元素是arr_len - 1


与其自己手动查找尺寸,不如使用std::vector:更好、更安全

std::vector<double> arr {1.1, 1.2, 1.3, 1.4};
std::cout << arr.size();
相关文章: