试图了解C ++指针和数据类型初始化

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

我正在尝试学习C ++,我在C#方面有相当丰富的经验,两种语言是如此不同,并且在理解数据类型和数据类型的指针变体以及它们的初始化方面遇到困难,请考虑以下代码:

    wchar_t *array = new wchar_t[10]; //Declaring a pointer of wchart_t and initializing to a wchar_t array of size 10 ?
    auto memAddressOfPointer = &array; //auto is resolving memAddressOfPointer to a pointer of a pointer?
    cout << array << endl; //Printing the memory address of array not the object created above?
    cout << *array << endl; //Getting the actual value of the object (empty wchar_t array of size 10 in bytes?
    cout << &array << endl; //Printing the address of the obj?
    cout << memAddressOfPointer << endl; //Printing the address of the obj ?

我的问题是为什么我要创建一个指针并对其进行初始化?为什么不只创建wchar_t数组呢?像:

    wchar_t array [10];

我也参考此堆栈文章:Unable to create an array of wchar_t

谢谢您的考虑。

c++ pointers wchar-t
3个回答
2
投票

[如果您知道需要放入数组的元素数量的大小,则只需使用数组,即wchar_t arr[10];

如果不知道大小,则可以在运行时使用动态内存分配以所需的大小(即wchar_t *arr = new wchar_t[required_size])创建阵列。分配内存后,需要使用delete[]运算符(用于数组)和delete(用于非数组指针)来对其进行分配。但是,我强烈建议您不要这样做,而是选择二者之一

  • 在这种情况下使用std::wstring,它将自动为您处理。
  • 如果可以,将std::vector用于其他所有操作。这是一个动态数组,它将自动增长。没有手动内存管理等。
  • 如果必须使用指针,请使用智能指针,例如unique_ptrshared_ptr。使用智能指针的优势在于,一旦超出范围,它们将自动清除。

4
投票

如果编写程序时知道数组的范围,则wchar_t array [10];绝对没有错。如果10是固定(constexpr)的数字,请坚持使用。

wchar_t *array = new wchar_t[10];允许您做的是让10是您在运行时发现的数字。您可以将10更改为x,并让x为用户提供的数字或以某种方式计算的数字。另一方面,当wchar_t array [x];不是x时的constexpr是有效的C ++(但在某些实现中可用作扩展,称为VLA)。注意:使用new的一个缺点是您需要确保delete相同的指针。这并不总是那么简单。因此,通常不希望使用这些

raw

指针。而是使用智能指针,例如std::unique_ptr<wchar_t[]>,并且当指针超出范围时资源将为delete[] d。


1
投票
创建指针而不是数组的优点是可以利用动态分配,并且还可以使用指针的属性。考虑以下代表动态分配和重新分配的代码:
© www.soinside.com 2019 - 2024. All rights reserved.