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)的内容变成其他无效值。