C++引用和指针似乎相似,但是它们之间存在一些差异。引用是一个变量,它是现有变量的另一个名称,而指针是存储另一个变量地址的变量。
引用是变量,称为已有变量的另一个名称。通过存储另一个变量的地址来创建变量的引用。
引用变量可以被视为具有自动间接寻址的常量指针。在这里,自动间接意味着编译器会自动应用间接运算符(*)。
int &a = i;
在上面的声明中," a"是" i"变量的别名。我们也可以通过" a"变量来引用" i"变量。
#include <iostream> using namespace std; int main() { int i=8; //变量初始化 int &a=i; //创建参考变量 cout<<"The value of 'i' variable is :"<<a; return 0; }
在上面的代码中,我们创建了一个引用变量,即" i"变量的" a"。创建引用变量后,我们可以在" a"变量的帮助下访问" i"的值。
指针是一个变量,其中包含另一个变量的地址。可以在(*) operator 的帮助下取消引用,以访问指针指向的内存位置。
以下是引用和指针之间的区别:
通过一个简单的例子让我们理解。
#include <iostream> using namespace std; void func(int &); int main() { int a=10; std::cout <<"Value of 'a' is :" <<a<< std::endl; func(a); std::cout << "Now value of 'a' is :" <<a<< std::endl; return 0; } void func(int &m) { m=8; }
输出:
Value of 'a' is :10 Now value of 'a' is :8
而指针是一个变量,用于存储另一个变量的地址。由于它保留了一些变量的内存地址,因此使编程变得更加容易。
我们无法重新分配引用变量。现在,我们举一个简单的例子,如下所示:
#include <iostream> using namespace std; void func(int &); int main() { int i; //变量声明 int k; //变量声明 int &a=i; int &a=k;//error return 0; }
上面的代码显示了错误,即不允许多个int&a声明。因此,以上程序得出结论,重新分配操作对于参考变量无效。
而指针可以重新分配。当我们使用链表,树等数据结构时,这种重新分配非常有用。
让我们通过示例了解这种情况。
#include <iostream> using namespace std; void func(int &); int main() { int i; int &a=i; std::cout << "The address of 'a' variable is : " <<&a<< std::endl; std::cout << "The address of 'i' variable is : " <<&i<< std::endl; return 0; }
输出:
The address of 'a' variable is : 0x7fff078e7e44 The address of 'i' variable is : 0x7fff078e7e4
上面的输出显示引用变量和实际变量都具有相同的地址。
对于指针,指针变量和实际变量都将具有不同的内存地址。让我们通过一个例子来理解这一点。
#include <iostream> using namespace std; int main() { int k; int *p; p=&k; cout<<"The memory address of p variable is :"<<&p; cout<<"\nThe memory address of k variable is :"<<&k; return 0; }
输出:
The memory address of p variable is :0x7ffcc5c164b8 The memory address of k variable is :0x7ffcc5c164b4
#include <iostream> using namespace std; int main() { int *p; int a=8; int **q; p=&a; q=&p; std::cout << "The value of q is : " <<*q<< std::endl; return 0; }
在上面的代码中,指针" p"指向变量" a",而" q"是指向" p"的双指针。因此,我们可以说" p"的值将是" a"变量的地址,而" q"的值将是" p"变量的地址。
输出:
The value of q is : 0x7ffd104891dc
在引用的情况下,无法引用引用。如果我们尝试执行 c ++程序,则会抛出编译时错误
让我们通过示例了解这种情况。
#include <iostream> using namespace std; int main() { int a=8;//变量初始化 int &p=a;//为 ?a? 创建参考变量多变的。 int &&q=p; //对引用的引用无效,它会引发错误。 return 0; }
输出:
main.cpp: In function 'int main()': main.cpp:18:10: error: cannot bind 'int' lvalue to 'int&&' int &&q=p;
让我们看一个简单的指针示例。
#include <iostream> using namespace std; int main() { int a[]={1,2,3,4,5};//数组初始化 int *ptr; //指针声明 ptr=a; assigning base address to pointer ptr. cout<<"The value of *ptr is :"<<*ptr; ptr=ptr+1; //将 ptr 的值增加 1。 std::cout << "\nThe value of *ptr is: " <<*ptr<< std::endl; return 0; }
输出:
The value of *ptr is :1 The value of *ptr is: 2
让我们通过示例了解引用。
#include <iostream> using namespace std; int main() { int value=90; //变量声明 int &a=value; //为引用赋值 &a=&a+5//引用变量不能进行算术运算,它会引发错误。 return 0; }
上面的代码将引发编译时错误,因为引用不允许进行算术运算。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)