指针和引用

本文详细介绍了C++中的指针和引用,包括它们的定义、使用方法、初始化和赋值。指针是一种存放对象地址的数据类型,可以间接访问对象,但未初始化的指针可能导致运行时错误。引用则作为已存在对象的别名,一旦绑定就不能改变。在函数参数传递中,引用能提高效率并防止意外修改,而指针可能需要额外的解引用操作。指针和引用各有优缺点,它们在C++中互相补充,提供了灵活的编程选项。

指针

什么是指针

我们常说指针指向某个对象,是因为指针存放某个对象的地址,通过该地址可以达到间接访问该对象的目的

指针的使用

指针的定义
  • 声明变量时,要在变量名前加*符号
  • 如果在一条声明语句中定义了多个指针变量,每个变量前都要加*符号
int *ip1=nullptr,*ip2=nullptr;//ip1和ip2都是指向int类型的指针
double d,dp1=nullptr;//d是double型变量,dp1是指向double类型的变量
获取对象地址

我们需要将一个地址值传给一个指针变量,而取地址符&可以用来获取对象的地址,对于数组,其数组名就是数组的首地址。

间接访问对象

如果指针指向了一个对象,则允许使用解引用符*来访问该对象

在这里插入图片描述
在这里插入图片描述

&p1类型是int**,相当于是指针的指针

int ival = 10;
int iarr[5] = {
   
    1,2,3,4,5 };
int *ip1 = &ival;//此时ip1存放变量ival的地址,或者说ip1是指向变量ival的指针
int *arrp = iarr;//此时arrp存放数组iarr的首地址,或者说arrp是指向数组iarr的指针
指针的初始化
  • 通常指针的类型必须和所指向对象的类型一样,除了下面两个例外

  • 指向常量的指针可以指向非常量对象

    int ival=10;
    const int *ip=&ival//正确,但是不能通过ip来改变ival的值,即*ip=11是错误的
    
  • 基类的指针可以指向其派生类对象

虽然指针无需在定义时赋值,但是未经初始化的指针常常会引发运行时错误。

如果使用了未经初始化的指针,则该指针所占内存空间的内容被看作一个地址值,访问该指针相对于访问一个本不存在的位置上的不存在的对象。

建议初始化所有指针,如果一开始不知道指针指向某个对象,可以将它初始化为nullptr,这样程序就能检测并知道它没有指向任何具体的对象。

指针的赋值

给指针赋值其实就是使指针变量存放一个新的地址,从而指向一个新的对象;

但是有时候我们容易搞混,到底是改变了指针的值还是改变了指针所指向对象的值

记住赋值永远改变的是等号左侧的对象

int main()
{
   
   
	int ival1 = 10;
	int ival2 = 20;
	int *ip1 = &ival1
指针引用在编程中都用于间接访问操作内存中的数据,但它们在定义、初始化、可变性以及使用场景等方面存在显著的区别。 指针是一种变量,其值为另一个变量的地址,即内存地址。指针可以在声明后初始化为空,并且可以重新赋值指向不同的变量。这意味着指针可以在程序执行期间改变其所指向的对象。此外,指针可以被设置为`NULL`,表示它不指向任何有效的对象。当使用指针时,需要通过解引用操作符`*`来访问指针所指向的值。指针还可以进行算术运算,例如自增操作,这使得指针非常适合用于遍历数组等数据结构的操作。指针的大小通常取决于系统的架构,而不是它所指向的数据类型[^4]。 相比之下,引用更像是一个变量的别名,它必须在声明时初始化,并且一旦初始化后不能改变。这意味着引用始终绑定到初始化时指定的对象上。引用不能为`NULL`,因此在使用引用时不需要担心空引用的问题。由于引用直接操作被引用的变量,所以不需要解引用操作符。引用的大小与被引用的变量相同,因为引用本质上是一个别名[^4]。 在C++中,相比于指针更推荐使用引用,特别是在函数参数传递返回值的情况下,因为引用提供了更清晰的语法并且避免了空指针的风险。然而,在需要动态内存分配或者处理数组时,通常会使用指针。另外,当需要返回函数内部局部变量的引用时应当特别小心,因为这会导致悬空引用的问题[^5]。 下面是一个简单的例子,展示了如何声明使用指针引用: ```cpp int main() { int value = 10; int* ptr = &value; // 指针指向value的地址 int& ref = value; // 引用ref绑定到value // 通过指针修改value的值 *ptr = 20; // 通过引用修改value的值 ref = 30; return 0; } ``` 在这个例子中,无论是通过指针还是引用,都可以成功地修改`value`的值。但是需要注意的是,如果尝试返回一个局部变量的引用,那么这个引用将在函数返回后变成无效,因为局部变量的生命期随着函数的结束而结束。 综上所述,选择使用指针还是引用取决于具体的应用场景。如果需要一个能够改变指向不同对象的机制,并且可能需要处理空指针的情况,则应使用指针。如果希望确保总是有一个有效的对象被引用,并且希望获得更加直观的语法,则应使用引用
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倒地不起的土豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值