C++ 引用与指针

C++ 引用与指针 首页 / C++入门教程 / C++ 引用与指针

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 的帮助下取消引用,以访问指针指向的内存位置。

引用和指针区别

以下是引用和指针之间的区别:

  • 定义(Definition)   -  引用变量是已经存在的变量的另一个名称。它主要用在" 按引用传递"中,其中,将引用变量作为参数传递给该函数。

通过一个简单的例子让我们理解。

#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  

指针是一个变量,用于存储另一个变量的地址。由于它保留了一些变量的内存地址,因此使编程变得更加容易。

  • 声明(Declaration)  - 我们可以通过在变量之前添加“&”符号来声明参考变量。如果在表达式中使用此符号,则它将被视为地址运算符。

我们无法重新分配引用变量。现在,我们举一个简单的例子,如下所示:

#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声明。因此,以上程序得出结论,重新分配操作对于参考变量无效。

而指针可以重新分配。当我们使用链表,树等数据结构时,这种重新分配非常有用。

  • 内存地址(Memory Address)   -  引用和实际变量都引用相同的地址。在实际变量被删​​除或超出范围之前,不会将新变量分配给引用变量。

让我们通过示例了解这种情况。

#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 
  • 空值(NULL value)    -  我们无法将NULL值分配给引用变量,但是可以为指针变量分配NULL值。
  • 间接(Indirection)     -  指针可以具有指向提供多个以上间接级别的指针的指针。
#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;
  • 算术运算    -  算术运算可以应用于名为" Pointer Arithmetic "的指针,但是算术运算不能应用于引用。没有任何字词,即 C++ 中存在引用算法。

让我们看一个简单的指针示例。

#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;
}

上面的代码将引发编译时错误,因为引用不允许进行算术运算。

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

AI技术内参 -〔洪亮劼〕

技术领导力实战笔记 -〔TGO鲲鹏会〕

Android开发高手课 -〔张绍文〕

数据分析实战45讲 -〔陈旸〕

MongoDB高手课 -〔唐建法(TJ)〕

NLP实战高手课 -〔王然〕

动态规划面试宝典 -〔卢誉声〕

超级访谈:对话张雪峰 -〔张雪峰〕

Web 3.0入局攻略 -〔郭大治〕

好记忆不如烂笔头。留下您的足迹吧 :)