提问人:VX00 提问时间:11/3/2023 更新时间:11/3/2023 访问量:129
指针与数组 C++ [重复]
Pointers vs. Arrays C++ [duplicate]
问:
我知道指针的用途与数组不同,但它们有很多重叠之处,让我感到困惑。 例如,如果我声明了一个返回整数指针的函数,则数组或指针可以接收它并以相同的方式工作。至少在这种情况下。
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函数中删除它,但它没有给我那个选项。所以我的代码可以工作..但我不知道为什么......
数组和指针有什么区别,除了指针存储内存地址和数组存储元素列表之外。
谢谢:)
答:
简短的回答是,就目前而言,您的代码根本不起作用,也不应该编译。例如,如果我尝试使用 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::vector
operator=
vector
function
function
评论
myArray=function()
不应编译。您使用的是哪些编译器和编译选项?请确保您的代码已编译。正如所发布的那样,至少是一个错别字,应该是.ptr
myPtr
列出
这些值。是的,因为其第一个元素指向 的数组是用 和 in 和 /(你有一个拼写错误)in 分配的,所以只有在你调用 时才会被释放。newArray
ptr
function
myPtr
ptr
main
new[]
delete[]