一、指针和引用的定义和性质区别:

  1. 指针是一个变量,存储的是一个地址,需要分配内存空间。引用只是变量的别名,不需要分配内存空间;
  2. 引用必须初始化,初始化后就不会再改变了。而指针可以是空值,可以初始化之后改变;
  3. 可以有const指针,但是没有const引用;
  4. 指针本身一个变量,引用不是对象,所以指针可以有多级,引用只能是一级(int **p;合法 而 int &&a是不合法的);
  5. ”sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小;
  6. 指针和引用的自增(++)运算意义不一样;
  7. 引用访问一个变量是直接访问,而指针访问一个变量是间接访问。

二、指针和引用作为函数参数进行传递时的区别

(1)指针作为参数进行传递:

#include<iostream>
using namespace std;
void myswap(int *a, int *b)
{
	int *temp = a;
	a = b;
	b = temp;
}
void test(int *p)
{
	int a = 1;
	p = &a;
	cout << p << " " << *p << endl << endl;;
}
int main()
{
	int a = 1, b = 2;
	int *p = NULL;
	myswap(&a, &b);
	cout << a << " " << b << endl << endl;
	test(p);
	if (p == NULL)
		cout << "p为NULL" << endl << endl;
}

指针与引用的区别及指针的引用_数据结构学习

指针作为参数进行传递时,事实上也是值传递,只不过传递的是地址。这一过程是参数值的单向传递过程,一旦形参获得了值便与实参脱离关系,此后无论形参怎么改变,都不会影响实参。

如果要交换a,b的值,使用引用或改成如下代码。

void myswap(int *a, int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

(2)将引用作为函数的参数进行传递
引用作为函数参数进行传递时,实质上传递的是实参本身,是直接对实参进行修改,用引用进行参数传递时,节约时间,节约空间。

#include<iostream>
using namespace std;
void myswap(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;
}
void test(int &a)
{
	cout << &a << " " << a << endl << endl;
}
int main()
{
	int a = 1, b = 2;
	myswap(a, b);
	cout << a << " " << b << endl;
	cout << &a << " " << a << endl << endl;
	test(a);
}

指针与引用的区别及指针的引用_学习笔记_02
可以看到a,b值已经调换,主函数与 test(int &a)函数中a的地址和值都相同

(3)指针的引用
指针是一个对象,所以可以定义指针的引用

#include<iostream>
using namespace std;
void myswap(int *&a, int *&b)
{
	int *temp = a;
	a = b;
	b = temp;
}
void test(int *&p)
{
	int a = 1;
	p = &a;
	cout << p << " " << *p << endl << endl;
}
int main()
{
	int a = 1, b = 2;
	int *aa = &a, *bb = &b;	//需要重新定义指针变量,传入指针变量
	myswap(aa, bb);			//a,b地址为常量,不能修改
	cout << *aa << " " << *bb << endl;
	int *p = NULL;
	test(p);
	if (p != NULL)
		cout << "指针p不为NULL" << endl << endl;
	cout << p << " " << *p << endl << endl;
}

指针与引用的区别及指针的引用_数据结构学习_03

aa,bb是指针,分别指向a和b,作为引用将aa,bb传递给函数myswap(),二者交换了地址值,直接对实参进行修改。

主函数中*p值不为1,因为这时函数test()中的变量a生存期结束,已经不存在了

参考博文:https://blog.csdn.net/qq_27678917/article/details/70224813