C++ 使用指针遍历数组

标签 c++ arrays pointers

首先,我有一个函数来初始化数组并返回指向其第一个元素的指针。

int* getPtrToArray()
{
    int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    return array;
}

这个函数只是创建一个不会被使用的数组。

void testing()
{
    int junk[3] = {1234, 5678, 9101112};
}

这是我的主要功能:

int main()
{
    // #1
    int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int* ptr0 = array;

    cout << *ptr0 << endl;
    cout << ptr0[0] << endl;

    // #2
    int* ptr1 = getPtrToArray();

    cout << *ptr1 << endl;
    cout << ptr1[0] << endl;

    // #3
    testing();

    cout << *ptr1 << endl;
    cout << ptr1[0] << endl
}

输出结果为:

1
1
1
2066418736  // "ptr1[0]" should be the same as "*ptr1", right?
2066418736  // since testing() does not modify the array, why "*ptr1" is changed?
2066418736

我认为这六个输出应该是 1 (数组中的第一个元素)。有人可以向我解释一下吗?谢谢!

最佳答案

我似乎记得类似的东西是有效的,但它是一个滥用 C 的东西,而不是 C++ 的东西。

如果我没记错的话,堆栈不会费心删除旧数据,只是说它是免费的,然后下次初始化新数据时,数据可能会或可能不会损坏,具体取决于退出范围之前初始化的数量和退出作用域后,它的编译方式以及函数的使用。堆栈指针只是向后移动以回收内存,而不会费心删除内存,因为这需要额外的工作。

您可以从中获得奇怪的优化,但如果您使用 C++ 进行编程,则不应使用 C 数组,而应使用 vector 或其他 C++ 容器。另一方面,如果您使用 C 或汇编语言进行编程,则这种行为可能会被利用。

关于C++ 使用指针遍历数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33838692/

相关文章:

c++函数创建一个二维数组并返回指向二维数组的指针

c++ - 在具体类中将 protected 方法从抽象类更改为私有(private)

java - 在二维数组中填充随机数以进行列/行相加

javascript - 删除具有键值的嵌套数组中的对象

c - 结构体中指针的 Malloc + 指针算术 + free() + linkedList

使用指针更改 const int 的值

c++ - Wx-widgets - wxWebView - 修改上下文菜单

c++ - MFC120u.dll "missing"

c++ - 类模板继承自不完整的类

ios - 将 NSString 添加到 NSMutableArray 崩溃