声明指向整数数组C++的指针

JDN*_*JDN 0 c++ arrays pointers

我想在我的类的头文件中声明一个指向整数数组的指针.我有

private:
 int *theName;
Run Code Online (Sandbox Code Playgroud)

然后在构造函数中

theName = new int[10];
Run Code Online (Sandbox Code Playgroud)

这会有用吗?还有另一种方法可以做到这一点,所以你有一个指向数组的指针吗?

我以为int*theName创建了一个指向整数而不是整数数组的指针,如果这创建了一个指向整数数组的指针,那么如何创建一个只指向整数的指针?

我也可以在析构函数中调用

delete theName; theName = NULL;
Run Code Online (Sandbox Code Playgroud)

是否会删除name整数数组对象,然后将name指向内存中的null?

谢谢

Set*_*gie 7

四件事:

  • 一,是的,就是你如何制作一个指向数组的指针.请注意,指向整数的指针和指向整数数组的指针之间没有区别; 您可以将整数视为一个元素的数组.你仍然可以使用x[0]if x是一个指向整数的指针,你仍然可以使用*xif x是指向数组的指针,它们的工作方式相同.

  • 其次,你必须使用delete[] theName,而不是 delete theName.无论您在何处new使用delete,都必须使用,无论您在何处使用new[],都必须使用delete[].此外,没有必要设置theName = NULL因为在析构函数运行后,theName无论如何都无法访问.

  • 第三,当你编写一个管理资源的类时,你需要编写一个复制构造函数,移动构造函数,复制赋值运算符和移动赋值运算符.

  • 第四,除非你只是作为一个教学练习,你应该真的使用std::vector.它有许多优点,没有实际缺点.如果你使用,你甚至不必编写其他四个构造函数vector.

  • 讨厌成为一个学究者,但这个 - >*"指向整数的指针与指向整数数组的指针之间没有区别"*不是真的.*我*知道你的意思,但OP可能没有,如果他从字面上理解你所说的那一点,那么这一点肯定会让他感到困惑. (5认同)

Jer*_*fin 6

我根本不想发布这个,但我希望它不会引起问题。

迂腐:大多数其他答案都是错误的:您创建的不是指向数组的指针。它是一个指向int数组的初始元素的指针。

我犹豫要不要发布它,原因很简单,这几乎可以肯定只是在您的问题中使用了错误的措辞——指向的指针int几乎可以肯定是您认为想要的,而这正是您真正得到的。

但是,有诸如指向数组的指针之类的东西。它很少有用,因为当/如果您对其进行指针数学运算(包括下标),指向数组的指针会增加它指向的数组的大小。在您的情况下,您分配 10int秒。您可以使用指针的下标来引用int数组中的s,因此theName[0]引用第一个inttheName[1]第二个int,依此类推——这正是您通常想要的。

如果您正在处理(例如)数组数组,并且想要一个指针一次遍历整行,那么您可能能够真正使用指向数组的指针,ptr[0]第一行也是如此,ptr[1]第二行,以此类推。例如:

#include <iostream>

static const int x = 20;
static const int y = 10;

int main() {
    char data[y][x];

    auto ptr_array = &data[0];
    char *ptr_char = &data[0][0];

    std::cout << "Address of entire array: " << (void *)data << "\n";

    std::cout << "char *[0] = " << (void *)ptr_char << "\n";
    std::cout << "char *[1] = " << (void *)(ptr_char+1) << "\n";

    std::cout << "array *[0] = " << (void *)ptr_array << "\n";
    std::cout << "array *[1] = " << (void *)(ptr_array+1) << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我已将其更改为使用char(而不是int)的数组数组,以使数学更加明显- sizeof(char) == 1(根据定义),因此计算数学会更容易一些。当我在我的机器上运行这段代码时,我得到的地址是:

Address of entire array: 0047FD2C
char *[0] = 0047FD2C
char *[1] = 0047FD2D
array *[0] = 0047FD2C
array *[1] = 0047FD40
Run Code Online (Sandbox Code Playgroud)

如您所见,ptr[0]无论哪种方式都将数组的地址作为一个整体保存。但是,对于指向 的指针charptr[1]保存的地址要大一。然而,指向数组的指针持有一个地址 0x40 - 0x2C = 0x14 = 20 更大——这与我们给数组 (20) 的 X 维度相符。换句话说,我们确实有一个指向数组的指针,并且该指针上的指针算术(或等效地,下标)一次对整个数组起作用。

不过我要重复一遍:至少如果我们忽略您几乎肯定应该使用 an的事实,那么std::vector您想要的类型和您获得的类型都是pointer to int. 有这样的类型pointer to array,但它几乎肯定不是你真正想要的。