如何解决为什么我不能在 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;
}
输出:
在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;
}
function1
为 A
分配一个新值。但是,A
是 function1
中的局部变量。将 23
分配给该新数组的第一个元素,不会影响最初指向的数组 A
。
function2
也通过值传递 A
。但是,它不会尝试修改 A
。它只是使用 A
在 23
指向的地址写入 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
后仍然指向 a
。 p = &b;
中的 function1
仅影响 p
本地的 function1
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。