微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我不能在 C++ 的外部函数中重新寻址指针?

如何解决为什么我不能在 C++ 的外部函数中重新寻址指针?

我有一个简单的代码

void function1(int* A);
void function2(int* A);

int main(int argc,char* argv[]) {

    int* A = new int[4];
    // Readdressed into function1: A[0] is preserved
    A[0] = 21;
    function1(A);
    cout << "\nA[0] is: " << A[0];
    // Result A[0] = 21

    // Is not readdressed into function2: A[0] is not preserved
    A[0] = 21;
    function2(A);
    cout << "\nA[0] is: " << A[0];
    // Result A[0] = 23

    return 0;
}

void function1(int* A) {
    A = new int[4];
    A[0] = 23;
}
void function2(int* A) {
    A[0] = 23;
}

输出

函数1输出A[0]为21的情况

在function2输出A[0]为23的情况下

问题: 为什么 A 指针没有获得(在第一种情况下)A[0] 为 23 的新分配内存单元的地址,而是保留 A[0] 为 21 的地址?

解决方法

除非传递引用,否则参数是按值传递的。指针也不例外。

void function1(int* A) {
    A = new int[4];
    A[0] = 23;
}
void function2(int* A) {
    A[0] = 23;
}

function1A 分配一个新值。但是,Afunction1 中的局部变量。将 23 分配给该新数组的第一个元素,不会影响最初指向的数组 A

function2 也通过值传递 A。但是,它不会尝试修改 A。它只是使用 A23 指向的地址写入 A


考虑这个与您的 function1 相似的示例:

#include <iostream>


int a,b = 0;

void function1(int* p) {
    p = &b;
    *p = 42;
}

int main() {
    std::cout << a << b << "\n";
    int* ptr = &a;
    function1(ptr);
    std::cout << a << b << *ptr << "\n";
}

输出是

00 
0420

因为在 function1 中调用 ptr main 后仍然指向 ap = &b; 中的 function1 仅影响 p 本地的 function1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。