#include <iostream>
using namespace std;
void change(int* addr) {
printf("addr指向的地址为%p\n", addr);
cout << endl;
int a = 4;
addr = &a;
printf("addr指向的地址为%p\n",addr);
}
int main(void) {
int* add = NULL;
cout <<"add指向的地址"<< add << endl;
change(add);
cout << "add指向的地址" << add << endl;
system("pause");
return 0;
}
之前在看到这个结果的时候我很疑惑,我想通过函数去改变指针指向的地址,发现无法改变,我以为将指针add当作实参传入函数中后,形参addr和实参add指向同一块地址,我们改变addr的指向就改变了add的指向,结果告诉我们不是这样,在我经过查询资料以及思考,想出来可能的原因。
实参的add和形参的addr根本不是一个东西,他们是两个不同的指针,只不过指向同一块内存。当我们让addr指向别的地址时,add还是指向原来的地址,所以不能通过改变addr的指向改变add的指向,因为他们不是一个东西。要是想达到类似的效果,还得是用引用.
#include <iostream>
using namespace std;
void change(int* addr) {
printf("addr的地址为%p\n", &addr);
cout << "addr指向的地址" << addr << endl;
cout << endl;
int a = 4;
addr = &a;
printf("addr的地址为%p\n", &addr);
printf("addr指向的地址为%p\n",addr);
}
int main(void) {
int* add = NULL;
cout <<"add的地址"<< &add << endl;
cout << "add指向的地址" << add << endl;
change(add);
cout << "add的地址" << &add << endl;
cout << "add指向的地址" << add << endl;
system("pause");
return 0;
}
我们可以利用引用达到预期的效果(形参改为int*&addr)
#include <iostream>
using namespace std;
void change(int* &addr) {
printf("addr的地址为%p\n", &addr);
cout << "addr指向的地址" << addr << endl;
cout << endl;
int a = 4;
addr = &a;
printf("addr的地址为%p\n", &addr);
printf("addr指向的地址为%p\n",addr);
}
int main(void) {
int* add = NULL;
cout <<"add的地址"<< &add << endl;
cout << "add指向的地址" << add << endl;
change(add);
cout << "add的地址" << &add << endl;
cout << "add指向的地址" << add << endl;
system("pause");
return 0;
}
我们还可以通过二级指针,达到预期的效果。
#include <iostream>
using namespace std;
void change(int**addr) {
int a = 4;
cout << "add指向的地址" << *addr << endl;
*addr = &a;
cout << "add指向的地址" << *addr << endl;
}
int main(void) {
int* add = NULL;
cout << "add指向的地址" << add << endl;
change(&add);
cout <<"add指向的地址"<< add<<endl;
system("pause");
return 0;
}
为什么函数的形参用二级指针就可以了呢?我们将add的地址作为参数传递给二级指针addr,这时候addr就指向add的地址 (假设0x666和0x999分别为add和addr的地址)
我们对addr进行解引用操作就相当于对add的指向进行操作,*addr=&a就相当于让add指向&a。