我知道指针与数组有不同的用途,但它们有很多重叠,这让我感到困惑。 例如,如果我声明一个返回整数指针的函数,则数组或指针可以接收它并以相同的方式工作。 。 .至少在这种情况下。
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”初始化的,所以我尝试在主函数中删除它,但它没有给我这个选项。所以我的代码有效......但我不知道为什么......
除了明显的指针存储内存地址和数组存储元素列表之外,数组和指针之间还有什么区别..
谢谢你:)
简单的回答是,就目前情况而言,您的代码根本无法工作,并且不应编译。例如,如果我尝试使用 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
将直接写入要返回值的位置。