指针与数组 C++

问题描述 投票:0回答:1

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

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”初始化的,所以我尝试在主函数中删除它,但它没有给我这个选项。所以我的代码有效......但我不知道为什么......

除了明显的指针存储内存地址和数组存储元素列表之外,数组和指针之间还有什么区别..

谢谢你:)

c++ arrays pointers
1个回答
0
投票

简单的回答是,就目前情况而言,您的代码根本无法工作,并且不应编译。例如,如果我尝试使用 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()
的内部实现来知道。

使用

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::vector
重载构造函数和
operator=
来复制或移动向量的内容 - 或者它可以(并且在这种情况下)基本上创建一个空的
vector
来保存返回值,然后传递对该空向量的隐藏引用写入
function
,并且
function
将直接写入要返回值的位置。

© www.soinside.com 2019 - 2024. All rights reserved.