指针和引用详解

目录

1、指针

2、引用

3、指针与引用的区别


指针和引用是C++中的两个重要概念,用于处理内存中的数据。它们都可以用来访问内存中的数据,但是它们之间有很多不同之处。

1、指针

(1)指针的定义

        指针是一种变量类型,用于存储另一个变量的内存地址。它可以指向任何数据类型的变量,包括整数、浮点数、字符、数组、结构体等。指针变量本身也有一个内存地址,可以通过取地址符“&”来获取。指针变量的值可以通过解引用符“*”来访问所指向的变量的值。指针在C语言中是非常重要的概念,它可以用于动态内存分配、函数传递参数、数据结构等方面。

(2)指针示例:

int value = 10;
int* ptr = &value; // 定义指向value的指针
cout << *ptr; // 输出指针所指向的值,即10
*ptr = 20; // 修改指针所指向的值
cout << value; // 输出value的值,即20

在这个示例中,我们定义了一个int类型的变量value,并将其初始化为10。然后,我们定义了一个指向value的指针ptr,并使用取地址运算符&来获取value变量的地址。接着,我们用解引用运算符*来输出指针所指向的值,即10。最后,我们修改了指针所指向的值为20,并输出value的值,即20。

(3)指针的指针

指针的指针是指一个指针变量的地址,也就是指向指针变量的指针。在C语言中,可以通过使用双重指针(即指向指针的指针)来实现动态内存分配和传递指针数组等操作。

以下是一个指针的指针的示例:

#include <stdio.h>

int main() {
    int x = 10;
    int *ptr1 = &x;
    int **ptr2 = &ptr1;
    
    printf("Value of x: %d\n", x);
    printf("Value of ptr1: %p\n", ptr1);
    printf("Value of ptr2: %p\n", ptr2);
    printf("Value of *ptr1: %d\n", *ptr1);
    printf("Value of **ptr2: %d\n", **ptr2);

    **ptr2 = 20;
    
    printf("Value of x: %d\n", x);
    printf("Value of ptr1: %p\n", ptr1);
    printf("Value of ptr2: %p\n", ptr2);
    printf("Value of *ptr1: %d\n", *ptr1);
    printf("Value of **ptr2: %d\n", **ptr2);

    return 0;
}

这个程序定义了一个整数变量x,一个指向x的指针ptr1和一个指向ptr1的指针ptr2。我们可以使用ptr1来访问x的值,使用ptr2来访问ptr1的值,使用**ptr2来访问x的值。

在程序的第一个输出语句中,我们打印了x、ptr1和ptr2的值,以及ptr1和ptr2的值。接下来,我们将ptr2的值设置为20,这将更新x的值。在程序的第二个输出语句中,我们再次打印了x、ptr1和ptr2的值,以及ptr1和**ptr2的值,以验证x的值是否已更新。

输出结果如下:

Value of x: 10
Value of ptr1: 0x7fff5fbff72c
Value of ptr2: 0x7fff5fbff720
Value of *ptr1: 10
Value of **ptr2: 10
Value of x: 20
Value of ptr1: 0x7fff5fbff72c
Value of ptr2: 0x7fff5fbff720
Value of *ptr1: 20
Value of **ptr2: 20

2、引用

(1)引用的定义:

        C++引用是一个别名,它是在声明时用&符号定义的。引用可以看作是一个变量的别名,即通过引用来访问这个变量,引用本身并不占用内存空间。引用变量必须在定义时进行初始化,一旦初始化后,就不能再改变其指向的变量。引用在函数参数传递、函数返回值等方面有广泛的应用。

(2)引用示例:

int value = 10;
int& ref = value; // 定义value的引用
cout << ref; // 输出引用所引用的值,即10
ref = 20; // 修改引用所引用的值
cout << value; // 输出value的值,即20

在这个示例中,我们定义了一个int类型的变量value,并将其初始化为10。然后,我们定义了一个value的引用ref,并使用&符号将其定义为value的别名。接着,我们用引用来输出value的值,即10。最后,我们修改了引用所引用的值为20,并输出value的值,即20。

3、指针与引用的区别

(1)定义方式不同

指针是一个变量,用于存储另一个变量的地址,其定义方式为在变量名前加上“*”符号,例如:int *p;

引用是一个别名,用于给已经存在的变量起一个新的名称,其定义方式为在变量名前加上“&”符号,例如:int &r = a;

(2)作用不同

指针可以用于修改变量的值,也可以用于动态分配内存。

引用主要用于简化代码,避免使用指针时需要频繁解引用,同时也可以用于传递函数参数,使得函数调用更加高效。

(3)空指针和野指针

指针可以指向一个空地址,即NULL指针,也可以指向一个未知的地址,即野指针。

引用必须指向一个已经存在的变量,否则会产生编译错误。

(4)可以使用sizeof运算符

对于指针,可以使用sizeof运算符获取指针本身所占的字节数。

对于引用,由于其本质是一个别名,所以无法使用sizeof运算符获取其所占的字节数。

(5)作用域不同

指针可以在不同的作用域中声明,可以在函数内部创建并使用,也可以在函数外部声明并在多个函数中使用。

引用必须在声明时初始化,并且只能在声明所在的作用域内使用。

总结:指针可以指向任何类型的数据,而引用只能引用同类型的数据。指针可以被重新赋值,而引用不可以。指针可以为空,而引用必须始终引用一个有效的对象。在使用指针和引用时,需要注意它们的特点,以避免出现错误。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值