C++基础(24)引用与指针

338 阅读2分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第24篇文章,点击查看活动详情

引用与指针:

引用和指针都可用于在另一个函数中更改一个函数的局部变量。当作为参数传递给函数或从函数返回时,它们也可用于保存大对象的复制,以提高效率。尽管有上述相似之处,但引用和指针之间存在以下差异。

  1. 指针可以声明为 void,但引用永远不能为 void 例如
int a = 10;
void* aa = &a; // it is valid
void& ar = a;  // it is not valid

2.指针变量有n级/多级间接,即单指针、双指针、三指针。然而,参考变量只有一个/单一的间接级别。以下代码揭示了上述几点:

  1. 引用变量不能更新。

  2. 引用变量是一个内部指针。

  3. 引用变量的声明以“&”符号开头(但不要将其读作“地址”)。

#include <iostream>
using namespace std;

int main()
{
	int i = 10; // 简单或普通变量。
	int* p = &i; // single pointer
	int** pt = &p; // double pointer
	int*** ptr = &pt; // triple pointer
	// 上述所有指针的不同之处在于它们存储或指向的值。
	cout << "i = " << i << "\t"
		<< "p = " << p << "\t"
		<< "pt = " << pt << "\t"
		<< "ptr = " << ptr << '\n';
	int a = 5; // simple or ordinary variable
	int& S = a;
	int& S0 = S;
	int& S1 = S0;
	cout << "a = " << a << "\t"
		<< "S = " << S << "\t"
		<< "S0 = " << S0 << "\t"
		<< "S1 = " << S1 << '\n';
	// 上述所有引用的值没有区别,因为它们都引用同一个变量。
}
  • 引用不如指针强大
    1) 引用一旦创建,以后就不能再引用另一个对象;它无法重置。这通常使用指针来完成。
    2) 引用不能为 NULL。指针通常设为 NULL 以表明它们没有指向任何有效的东西。
    3) 引用必须在声明时进行初始化。指针没有这样的限制。
    由于上述限制,C++ 中的引用不能用于实现链表、树等数据结构。在 Java 中,引用没有上述限制,可用于实现所有数据结构。 Java 中更强大的引用是 Java 不需要指针的主要原因。\

  • 引用更安全,更易于使用:
    1) 更安全 因为必须初始化引用,所以像 wild pointers 不太可能存在。仍然可能有未引用有效位置的引用(请参阅下面练习中的问题 5 和 6)
    *2) 更易于使用: * 引用不需要解引用运算符来访问值。它们可以像普通变量一样使用。 '&' 运算符仅在声明时才需要。此外,对象引用的成员可以使用点运算符 ('.') 访问,这与需要箭头运算符 (->) 来访问成员的指针不同。\

  • 加上上述原因,像复制构造函数参数这样的地方很少有不能使用指针的地方。必须使用引用在复制构造函数中传递参数。同样,引用必须用于重载一些运算符,如 ++。

锻炼:
预测以下程序的输出。如果有编译错误,请修复它们。
问题 1

#include <iostream>
using namespace std;

int& fun()
{
	static int x = 10;
	return x;
}

int main()
{
	fun() = 30;
	cout << fun();
	return 0;
}

问题 2

#include <iostream>
using namespace std;

int fun(int& x) { return x; }

int main()
{
	cout << fun(10);
	return 0;
}

问题 3

#include <iostream>
using namespace std;

void swap(char*& str1, char*& str2)
{
	char* temp = str1;
	str1 = str2;
	str2 = temp;
}

int main()
{
	char* str1 = "GEEKS";
	char* str2 = "FOR GEEKS";
	swap(str1, str2);
	cout << "str1 is " << str1 << '\n';
	cout << "str2 is " << str2 << '\n';
	return 0;
}

问题 4

#include <iostream>
using namespace std;

int main()
{
	int x = 10;
	int* ptr = &x;
	int&* ptr1 = ptr;
}

问题 5

#include <iostream>
using namespace std;

int main()
{
	int* ptr = NULL;
	int& ref = *ptr;
	cout << ref << '\n';
}

问题 6

#include <iostream>
using namespace std;

int& fun()
{
	int x = 10;
	return x;
}

int main()
{
	fun() = 30;
	cout << fun();
	return 0;
}

如果大家在阅读我的文章的时候发现了一些错误,欢迎在评论区留言告诉我。我是一个正在学习C++的蒟蒻,关注我,我们一起加油。