我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第24篇文章,点击查看活动详情
引用与指针:
引用和指针都可用于在另一个函数中更改一个函数的局部变量。当作为参数传递给函数或从函数返回时,它们也可用于保存大对象的复制,以提高效率。尽管有上述相似之处,但引用和指针之间存在以下差异。
- 指针可以声明为 void,但引用永远不能为 void 例如
int a = 10;
void* aa = &a; // it is valid
void& ar = a; // it is not valid
2.指针变量有n级/多级间接,即单指针、双指针、三指针。然而,参考变量只有一个/单一的间接级别。以下代码揭示了上述几点:
-
引用变量不能更新。
-
引用变量是一个内部指针。
-
引用变量的声明以“&”符号开头(但不要将其读作“地址”)。
#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++的蒟蒻,关注我,我们一起加油。