int *pa(指针)和int *&pa(指针的引用)的区别

funa(int * pa);

funb(int*& pb);

两参数的数据交换的情况:

funone(int *pa,int *pb):
#include<iostream>
using namespace std;
void funone(int *pa,int *pb)
{//单传递,只在函数里面实现了交换指针指向的地址值。
	//执行函数之后,外部的两个指针指向的地址值不受函数内部的影响。
	cout << "进入funone函数里面:" << endl;
	cout << "pa:"<<pa << "  pb:"<<pb << endl;
	cout << "a:" << *pa << "  b:" << *pb << endl;
	int *temp = pa;  
	pa = pb;
	pb = temp;
	cout << "在funone函数里面,进行指针的地址交换之后:"<< endl;
	cout << "pa:" << pa << "  pb:" << pb << endl;
	cout << "a:" << *pa << "  b:" << *pb << endl << endl;
}
int main()
{
	int a = 100;
    int b =200;
	int *pa = &a;
	int *pb = &b;
	cout << "执行funone(pa,pb)之前:"<<endl;
	cout<<"pa指向的内容:"; cout << *pa << "  pb指向的内容:" << *pb << endl << endl;

	funone(pa,pb);
	cout << "执行funone(pa,pb)之后:" << endl;
	cout <<"pa指向的内容:"<< *pa <<"  pb指向的内容:"<< *pb << endl;
	cout << "a的地址:"<<&a << "    b的地址:" << &b << endl;
	cout << "a的地址(pa):"<<pa << "    b的地址(pb):" << pb << endl;
	cout << endl << endl;
	return 0;
}
打印结果:



funone(int *&pa,int *&pb)
#include<iostream>
using namespace std;
void funone(int *&pa,int *&pb)
{//可以说实现了双向传递,内部和外部的两个指针都影响。
	cout << "进入funone函数里面:" << endl;
	cout << "pa:"<<pa << "  pb:"<<pb << endl;
	cout << "a:" << *pa << "  b:" << *pb << endl;
	int *temp = pa;  
	pa = pb;
	pb = temp;
	cout << "在funone函数里面,进行指针的地址交换之后:"<< endl;
	cout << "pa:" << pa << "  pb:" << pb << endl;
	cout << "a:" << *pa << "  b:" << *pb << endl << endl;
}
int main()
{
	int a = 100;
    int b =200;
	int *pa = &a;
	int *pb = &b;
	cout << "执行funone(pa,pb)之前:"<<endl;
	cout<<"pa指向的内容:"; cout << *pa << "  pb指向的内容:" << *pb << endl << endl;

	funone(pa,pb);
	cout << "执行funone(pa,pb)之后:" << endl;
	cout <<"pa指向的内容:"<< *pa <<"  pb指向的内容:"<< *pb << endl;
	cout << "a的地址:"<<&a << "    b的地址:" << &b << endl;
	cout << "b的地址(pa):"<<pa << "    a的地址(pb):" << pb << endl;
	cout << endl << endl;
	return 0;
}
打印结果:


一个参数传递的情况:
#include<iostream>
using namespace std;
int m_fun = 1;

void funa(int *pa)
{
	cout << "在funa函数里面:" << endl;
	cout << "*pa的值" <<*pa<< endl;
	pa= &m_fun;
	*pa = 10;
//如果不添加pb=new int,这里的pa地址是m_fun的地址,可以显示*pa的值为10。
	pa = new int;
	cout << "进行运算之后:"<<endl;
	cout << "*pa的值" << *pa << endl << endl;
	//cout << p << endl;
}
void funb(int *&pb)
{
	cout << "在funb函数里面:" << endl;
	cout << "*pb的值" << *pb << endl;
	pb = &m_fun;
	// 也可以根据你的需求分配内存
	pb = new int;//改变pb的本身地址
	*pb = 5;
	cout << "进行运算之后:" << endl;
	cout << "*pb的值" << *pb << endl << endl;
	//cout << p << endl;
}
int main()
{
	int a = 300;
	int *pa = &a;
	cout << "执行funa函数之前:" << endl;
	cout << "a的地址值:" << &a << "   pa的地址值:" << pa << endl << endl;

	funa(pa);

	cout << "执行funa函数之后:" << endl;
	//如果在funa函数里面不添加pb=new int,这里不受影响(单向传递)。
	cout <<"m_fun的地址值:"<< &m_fun << "      pa由a的地址转变为m_fun的地址:" << pa << endl;
	cout << "a的值:" << a << "   pa的值:" << *pa << endl;
	cout << "funa(int *pa)函数实验结束!!!!" << endl << endl;

	int b = 400;
	int *pb = &b;
	cout << "执行funa函数之前:" << endl;
	cout << "b的地址值:" << &b << "   pa的地址值:" << pb << endl << endl;

	funb(pb);

	cout << "执行funb函数之后:" << endl;
	//如果在funb函数里面不添加pb=new int,这里的pa地址是m_fun的地址。
	cout << "m_fun的地址值:" << &m_fun << "     pa的地址是new int分配出来的地址:" << pb << endl;
	cout << "b的值:" << b << "   pb的值:" << *pb << endl;
	cout << "funb(int *pb)函数实验结束!!!!" << endl << endl;
return 0;
}
打印结果:
补充funone(int *pa,int *pb)函数知识:
我这里设置函数为funtwo(int *pa,int*pb):

#include<iostream>
using namespace std;
void funtwo(int *pa,int *pb)
{//可以说实现了双向传递,内部和外部的两个指针都影响。
int temp = *pa;
*pa = *pb;
*pb = temp;
}
int main()
{
int a = 100;
int b =200;
int *pa = &a;
int *pb = &b;
cout << "执行funone(pa,pb)之前:"<<endl;
cout<<"pa指向的内容:"; cout << *pa << "  pb指向的内容:" << *pb << endl << endl;

funtwo(pa,pb);
cout << "执行funone(pa,pb)之后:" << endl;
cout <<"pa指向的内容:"<< *pa <<"  pb指向的内容:"<< *pb << endl;
cout << endl << endl;
return 0;
}
打印结果:


好了,有了补充的知识,再结合以上的实验,总结了下:
int *pa(指针)和int *&pa(指针的引用)的区别:
指针的引用:
1.双向传递。
2.可以说是 指针的指针,*&指针本身可变。
例如:pa=new int,可以把新分配的地址赋值给pa本身,保持指向变量(m_fun)的内容不变。
指针:
1.可以单向传递,也可以双向传递。
单向传递:在函数内交换指向变量的地址,只对函数内部的指针有影响。
双向传递:在函数内交换指向变量的内容,对函数内部和外面的指针都有影响。
2.指针指向的数据是改变,而指针本身是不改变的。
例如:pa=new int,不能把新分配的地址赋值给pa本身,否则赋值之后,之前的指向变量(m_fun)的内容变成其他无效值。

猜你喜欢

转载自blog.csdn.net/chen1083376511/article/details/78571338
今日推荐