Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
声明指向整数数组C++的指针_C++_Arrays_Pointers - Fatal编程技术网

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

声明指向整数数组C++的指针,c++,arrays,pointers,C++,Arrays,Pointers,我想在类的头文件中声明一个指向整数数组的指针。我有 private: int *theName; 然后在构造函数中 theName = new int[10]; 这样行吗?有没有其他方法来实现这一点,以便您有一个指向数组的指针 我认为int*theName创建了一个指向整数的指针,而不是一个整数数组,如果这创建了一个指向整数数组的指针,那么如何创建一个指向整数的指针呢 在析构函数中也可以调用 delete theName; theName = NULL; 这会删除name integer

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

private:
 int *theName;
然后在构造函数中

theName = new int[10];
这样行吗?有没有其他方法来实现这一点,以便您有一个指向数组的指针

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

在析构函数中也可以调用

delete theName; theName = NULL;
这会删除name integer数组对象,然后在内存中将该名称指向null吗

谢谢四件事:

第一,是的,这就是如何创建指向数组的指针。请注意,指向整数的指针和指向整数数组的指针之间没有区别;您可以将整数视为一个元素的数组。如果x是指向整数的指针,则仍然可以使用x[0],如果x是指向数组的指针,则仍然可以使用*x,它们的工作原理相同

其次,您必须使用delete[]名称,而不是delete名称。无论在哪里使用new,都必须使用delete;无论在哪里使用new[],都必须使用delete[]。此外,没有必要设置name=NULL,因为在运行析构函数后,您将无法再访问该名称

第三,在编写管理资源的类时,需要编写复制构造函数、移动构造函数、复制赋值运算符和移动赋值运算符

第四,除非你只是作为一个说教练习,否则你应该真正使用std::vector。它有很多优点,但没有真正的缺点。如果使用vector,甚至不需要编写其他四个构造函数

是的,那会有用的

您需要写入delete[]名称-如果您分配了新类型[],则必须使用delete[]运算符进行删除

将名称设置为null是一种很好的形式,尽管在析构函数中是多余的,因为整个对象和名称很快就会不存在


更好的C++方法可能是使用STD::Vector .< /P> < P>是的,这就是如何初始化指针的方法。不过,您有一些问题:

您需要对使用新[]分配的任何内容调用delete[]。您的代码未按预期工作,并导致UB

您需要实现一个复制构造函数和赋值运算符。如果指针被复制到类型的另一个实例,会发生什么情况?您最终将对其调用delete[]两次

术语挑剔:

这会删除name integer数组对象,然后在内存中将该名称指向null吗

否,它将名称设置为空。名称是一个变量,与任何其他具有值的变量一样。这个变量恰好是一个地址,所以当作为地址使用时,是的,它的值将是NULL的数值,不管是什么

有没有其他方法来实现这一点,以便您有一个指向数组的指针

您可以使用std::vector。这[在大多数情况下]可以在使用阵列的任何位置插入插槽,并提供以下好处:

无需担心内存管理 需要时自动调整大小 可以继续使用array[index]语法 可以使用.at方法执行边界检查。 如果您想要指向第一个元素的指针,以提供给C风格的API等,您可以使用:

std::vector<int> vec(10);

SomeCFunction(&vec[0]);

是的,关于delete[]和vector之类的回答很好,但请记住:int*p是指向int的指针类型。它实际上是指向单个整数的指针。但是,如果你像这样解引用p[5],这和说*p+5是一样的。这也是阵列访问的工作原理。以及为什么可以将数组隐式转换为指向其第一个元素的指针。但是,有一个指向数组类型的指针。int*p[10]是指向大小为10的int数组的指针。然而,这不是你想要的。因为如果现在你说p[5],它的意思是*p+5,它将访问地址p+sizeof*p*5。但是sizeof*p是sizeof int[10],所以这里有混乱。当然,p[5]的类型是int[10],因为p是指向int[10]的指针-

我很犹豫是否发布此消息,但我希望它不会引起问题

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

我不愿意发表关于它的文章,原因很简单,几乎可以肯定,这只是因为在你的问题中使用了错误的措辞——指向int的指针几乎可以肯定是你所想要的,它是你真正得到的

然而,也有类似指向数组的指针这样的东西。它很少有用,因为当/如果对它进行指针数学(包括下标)时,指向数组的指针会以其指向的数组的大小递增。在您的情况下,分配10整数。您可以使用对指针的下标来引用数组中的整数,因此名称[0]引用第一个整数,名称[1]引用第二个整数,依此类推—这正是您通常想要的

你可能是abl 例如,如果您正在使用数组数组,并且想要一个指针一次遍历整行,那么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;
}
如您所见,ptr[0]以任何方式保存整个阵列的地址。然而,通过指向char的指针,ptr[1]保存了一个更大的地址。但是,指向数组的指针包含一个地址0x40-0x2C=0x14=20,大于0x40-0x2C=0x14=20,这与我们为数组20提供的X维度相匹配。换句话说,我们确实有一个指向数组的指针,指针算术,或者,等价地,在这个指针上下标,一次对整个数组起作用


不过我要重复一次:至少如果我们忽略一个事实,即几乎肯定应该使用std::vector,那么您想要的类型和得到的类型都是指向int的指针。有一种类型是指向数组的指针,但它几乎肯定不是您真正想要的。

除非您有很好的理由这样做,您可能应该只使用std::vector。可能不要对这么小的数组进行堆分配。我讨厌成为一个学究,但这->指向整数的指针和指向整数数组的指针之间没有区别,这是不正确的。我知道你的意思,但OP可能没有,如果他把你说的话逐字逐句地理解,这一点以后肯定会让他感到困惑。@BenjaminLindley如果不写一些庞大而分散注意力的东西,就很难进入这一阶段,因为它对初学者来说是如此的详细和混乱。但是,是的,这并不精确。我认为这是一个链接到一篇文章、导语或关于这个主题的问题作为旁注的好地方。@chris我真的不知道有哪篇文章是这样的。如果你知道一个答案,我或你可以编辑成答案。奇怪的是,我找不到任何关于这个的东西。仅指针数组与指向数组的指针。
Address of entire array: 0047FD2C
char *[0] = 0047FD2C
char *[1] = 0047FD2D
array *[0] = 0047FD2C
array *[1] = 0047FD40