尝试了解C++指针和数据类型初始化
Trying to understand C++ pointers and data type initializations
我正在尝试学习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_ptr
或shared_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);
尽管有这些优点和其他优点,但我认为您介绍的使用指针而不是数组的示例只是出于学术目的,以了解如何使用指针,以便在以后的课程中使用指针构建更复杂的数据结构,因为您使用恒定大小的数组。
- 内联静态数据的初始化
- 为什么基类数据在派生类数据之前初始化
- 尝试了解C++指针和数据类型初始化
- C++ 基元类型初始化与对象初始化
- C++ 2D shared_ptr数组使用抽象多态类型初始化
- 如何根据构造函数参数使用超类类型初始化成员变量?
- 使用没有默认构造函数的类/类型初始化自定义容器
- Visual C 新类型初始化
- 类定义中的静态数据成员初始化
- 使用大型数据集初始化类成员向量的最有效方法
- 为什么在静态数据成员初始化器中未完全定义类
- 如何创建一个编译时静态类类型,该类型初始化具有特定值的成员容器
- 使用初始化列表的 POD 类型初始化不起作用
- 重载放置新运算符,具有数据成员初始化以及与普通新运算符的差异
- 大括号之间的自定义类型初始化数组
- std::数组类型初始化
- 模板非静态数据成员初始化程序何时实例化
- C++静态数据成员初始化
- 使用初始化列表时的 C++ 数据成员初始化顺序
- Cocos2d-x AppDelegate数据成员初始化丢失