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



我正在尝试学习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];

我也参考了这个堆栈帖子: 无法创建wchar_t数组

感谢您的考虑。

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

如果您不知道大小,则可以在运行时使用所需大小的动态内存分配创建数组,即wchar_t *arr = new wchar_t[required_size].分配内存后,您需要使用数组delete[]运算符和非数组指针的delete运算符来释放内存。但是,我强烈建议您不要这样做,而是

  • 在这种特殊情况下使用std::wstring,它将自动为您处理此问题。
  • 如果可以,请将std::vector用于其他所有内容。它是一个动态数组,会自动增长。无需手动内存管理等。
  • 如果您必须使用指针,请使用智能指针,例如unique_ptrshared_ptr.使用智能指针的优点是,一旦超出范围,它们将自动清理。

如果你在编写程序时知道数组的范围,那么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相同的指针。这并不总是那么简单。因此,使用这些原始指针不是您通常想要做的。相反,请使用智能指针,如std::unique_ptr<wchar_t[]>,当指针超出范围时,资源将被delete[]d。

创建指针而不是数组的优点是可以利用的动态分配以及可能有帮助的指针属性。 请考虑以下表示动态分配和重新分配的代码:

int x;
cin >> x;
int *oldArr = malloc(x * sizeof(int));
for(int i = 0; i < x; i++)
arr[i] = i;
cin >> x;
arr = realloc(arr, x * sizeof(int));

这是另一个示例,显示了指针功能之一,您也可以将其与数组一起使用。

int arr[5] = {1, 2, 3, 4 ,5};
int *ptr = arr;
cout << *ptr;
ptr++;
cout << *ptr;
cout << *(ptr + 1);

尽管有这些优点和其他优点,但我认为您介绍的使用指针而不是数组的示例只是出于学术目的,以了解如何使用指针,以便在以后的课程中使用指针构建更复杂的数据结构,因为您使用恒定大小的数组。

最新更新