指针与数组 C++ [重复]

Pointers vs. Arrays C++ [duplicate]

提问人:VX00 提问时间:11/3/2023 更新时间:11/3/2023 访问量:129

问:

我知道指针的用途与数组不同,但它们有很多重叠之处,让我感到困惑。 例如,如果我声明了一个返回整数指针的函数,则数组或指针可以接收它并以相同的方式工作。至少在这种情况下。

int* function()
{
   int* newArray = new int[10];
   int* ptr = newArray;
   int i;

   for (i = 0; i < 10; ++i)
   {
      newArray[i] = i;
   }
   
   return ptr;
}

int main()
{
   int myArray[10];
   int* myPtr;
   
   ptr = function();
   myArray = function();
}   

myArray 如何捕获指针?如何将数组设置为第一个newArray元素的内存地址?我很困惑。

即使函数的作用域已结束,我也可以获得这些值。我以为数组也会在这个过程中被破坏,导致指针指向什么都没有。cout

我想也许newArray可能存在内存泄漏,因为它是用“new”初始化的,所以我尝试在main函数中删除它,但它没有给我那个选项。所以我的代码可以工作..但我不知道为什么......

数组和指针有什么区别,除了指针存储内存地址和数组存储元素列表之外。

谢谢:)

C++ 数组指

评论

7赞 Weijun Zhou 11/3/2023
myArray=function()不应编译。您使用的是哪些编译器和编译选项?请确保您的代码已编译。正如所发布的那样,至少是一个错别字,应该是.ptrmyPtr
0赞 Wyck 11/3/2023
我不确定你说“myArray 如何捕获指针”是什么意思?你说的捕捉是什么意思?
0赞 Miles Budnek 11/3/2023
"即使函数的作用域已结束,我也可以列出这些值。是的,因为其第一个元素指向 的数组是用 和 in 和 /(你有一个拼写错误)in 分配的,所以只有在你调用 时才会被释放。newArrayptrfunctionmyPtrptrmainnew[]delete[]
0赞 paddy 11/3/2023
推荐阅读:如何在 C++ 中使用数组?
0赞 user12002570 11/3/2023
在任何初学者 c++ 书籍中阅读有关数组到指针衰减的信息。

答:

2赞 Jerry Coffin 11/3/2023 #1

简短的回答是,就目前而言,您的代码根本不起作用,也不应该编译。例如,如果我尝试使用 gcc 13 编译它,它会产生如下错误消息:

test9.cpp:20:4: error: ‘ptr’ was not declared in this scope
   20 |    ptr = function();
      |    ^~~
test9.cpp:21:12: error: incompatible types in assignment of ‘int*’ to ‘int [10]’
   21 |    myArray = function();
      |    ~~~~~~~~^~~~~~~~~~~~

第一个很容易修复 - 我们只需要更改为 .ptr = function(); myPtr = function();

然而,第二个是完全不同的故事。在 C 和 C++ 中,数组是不可分配的,因此要使其工作,至少需要更改所涉及的一些类型。

如前所述,一种可能性是将返回值分配给指针。但是,这有一个大问题:尽管它提供了指向数据的指针,但它无法通知接收者该指针引用的数据数组有多大。在本例中,它恰好是 10,但我们只能通过查看 的内部实现来知道。function()

通常最好使用 a 而不是数组:std::vector

#include <vector>

std::vector<int> function() {
   std::vector<int> newArray(10);

   // Prefer to declare the loop control variable in the loop header;
   for (int i = 0; i < 10; ++i) {
      newArray[i] = i;
   }
   
   return newArray;
}

int main() {
   std::vector<int> myArray = function();
} 

这之所以有效,是因为重载构造函数并复制或移动向量的内容 - 或者它可以(在这种情况下将)基本上创建一个空来保存返回值,然后将对该空向量的隐藏引用传递给 ,并且将直接写入将要返回的值的位置。std::vectoroperator=vectorfunctionfunction