试图理解 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];
我也参考了这个堆栈 post:
Unable to create an array of wchar_t
感谢您的考虑。
如果在写程序的时候知道数组的范围,wchar_t array [10];
绝对没有错。如果 10
是一个固定的 (constexpr
) 数字 - 坚持下去。
wchar_t *array = new wchar_t[10];
让你做的是让 10
成为你在 运行 时间内找到的数字。您可以将 10
更改为 x
并让 x
成为用户提供的数字或您以某种方式计算的数字。 wchar_t array [x];
when x
is not a constexpr
另一方面 not valid C++ (but is available as an exension, called VLA, in some实施)。
注意:使用 new
的一个缺点是您需要确保 delete
相同的指针。这并不总是那么简单。因此,使用这些 raw 指针不是您通常想要做的。相反,使用智能指针,如 std::unique_ptr<wchar_t[]>
,当指针超出范围时,资源将 delete[]
d。
如果您知道需要放入数组的元素数量的大小,那么只需使用数组即可,即 wchar_t arr[10];
.
如果您不知道大小,可以在运行时使用具有所需大小的动态内存分配创建数组,即 wchar_t *arr = new wchar_t[required_size]
。分配内存后,您需要使用数组的 delete[]
运算符和非数组指针的 delete
来释放它。但是,我强烈建议您不要这样做,而是
- 在这种特殊情况下使用
std::wstring
,它将自动为您处理。
- 如果可以,对其他一切使用
std::vector
。这是一个会自动增长的动态数组。没有手动内存管理等
- 如果您必须使用指针,请使用像
unique_ptr
或 shared_ptr
这样的智能指针。使用智能指针的好处是一旦超出作用域就会自动清理。
创建指针而不是数组的优点是可以利用的动态分配以及可能有用的指针属性。
考虑以下表示动态分配和重新分配的代码:
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# 方面有相当多的经验,这两种语言非常不同,我在理解数据类型和数据类型的指针变体以及它们的初始化方面遇到了困难,请考虑下面的代码:
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];
我也参考了这个堆栈 post: Unable to create an array of wchar_t
感谢您的考虑。
如果在写程序的时候知道数组的范围,wchar_t array [10];
绝对没有错。如果 10
是一个固定的 (constexpr
) 数字 - 坚持下去。
wchar_t *array = new wchar_t[10];
让你做的是让 10
成为你在 运行 时间内找到的数字。您可以将 10
更改为 x
并让 x
成为用户提供的数字或您以某种方式计算的数字。 wchar_t array [x];
when x
is not a constexpr
另一方面 not valid C++ (but is available as an exension, called VLA, in some实施)。
注意:使用 new
的一个缺点是您需要确保 delete
相同的指针。这并不总是那么简单。因此,使用这些 raw 指针不是您通常想要做的。相反,使用智能指针,如 std::unique_ptr<wchar_t[]>
,当指针超出范围时,资源将 delete[]
d。
如果您知道需要放入数组的元素数量的大小,那么只需使用数组即可,即 wchar_t arr[10];
.
如果您不知道大小,可以在运行时使用具有所需大小的动态内存分配创建数组,即 wchar_t *arr = new wchar_t[required_size]
。分配内存后,您需要使用数组的 delete[]
运算符和非数组指针的 delete
来释放它。但是,我强烈建议您不要这样做,而是
- 在这种特殊情况下使用
std::wstring
,它将自动为您处理。 - 如果可以,对其他一切使用
std::vector
。这是一个会自动增长的动态数组。没有手动内存管理等 - 如果您必须使用指针,请使用像
unique_ptr
或shared_ptr
这样的智能指针。使用智能指针的好处是一旦超出作用域就会自动清理。
创建指针而不是数组的优点是可以利用的动态分配以及可能有用的指针属性。 考虑以下表示动态分配和重新分配的代码:
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);
尽管有这些优点和其他优点,但我认为您展示的使用指针而不是数组的示例仅用于学术目的,以了解如何使用指针,以便在以后的课程中使用指针构建更复杂的数据结构因为您使用的是恒定大小的数组。