函数的形参是指针所遇到的一些问题

#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。 

猜你喜欢

转载自blog.csdn.net/lxyhhhhhcl/article/details/133249867