【c++教程】2.3-指针类型

本文详细介绍了C++中的指针,包括什么是指针、指针的定义方式以及如何使用const限定指针。通过示例解析了不同const位置对指针的影响,帮助读者更好地理解和掌握指针的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说起c语言或者c++,很多人第一反应可能是指针很难,学习到了指针就开始学不会了。但是实际上,使用指针并不算一件困难的事情。而且,有了引用和智能指针以后,相应的,传统指针的使用也在减少。不过,在很多情况下,我们仍然有理由认为,使用指针要比引用更好。

什么是指针

我们知道,程序中的数据是保存在内存中的,不同的数据类型保存的位置和方式也不同。而所谓指针,就是一个指向这些内存地址的一个标记,换言之,就是通过对指针的寻址,可以找到对应的内存地址。由于有很多种不同的数据类型,因此对应的指针类型也是各不相同的。

指针的定义

定义指针需要通过运算符*,对应的数据类型,加上*运算符,即可定义一个指针。

// 指针的几种定义写法

// 方式一,这种方式最为常用
int *p1;

// 方式二
int* p2;

// 方式三
int * p3;

// 方式四,这种方式不太好,比较不建议使用
int*p4;

正如一直所说的那样,c++是一种自由的语言,在如何定义指针的这个问题上,也是非常自由的。以上四种方式都是对的,具体选用哪种仅仅是风格问题,不会涉及到正确与否。因此你可以选择一种你喜欢的方式。 

如果你是第一次接触指针,那么有一个概念你必须要非常清晰。指针和普通的变量的区别在于,普通变量只对应一个值,那就是它内存地址中保存的值。但是指针对应了两个值,一个是它本身指向的内存地址的值,另外一个是其指向的内存地址中保存的值。

一个指针通过*运算符,取得其内存地址中保存的值,*运算符也可以叫做解引用运算符。想要取得一个变量的地址,需要使用&运算符,&运算符也可以叫做取址运算符。


int a = 100;
int b = 250;

// 定义一个指针p,p保存a的地址
int *p = &a;

// 将p中对应的地址中保存的值修改为200
// 尤其要注意的是,定义的时候,需要给赋值一个地址
// 但是赋值完地址以后,通过*p去访问的时候,取得是值
*p = 200;

// 此时,输出a,结果应当为200
cout << a << endl;

// 将p的地址修改为b的
p = &b;

// 此时,输出*p,结果应当为250
cout << *p << endl;

特别注意,当通过逗号运算符连续定义变量的时候,需要每一个都加*,否则后续的变量,不是指针类型

// 此时a为指针类型,b为普通的int类型
// b不是指针
int *a, b;

// 如果想要连续定义指针,必须每个都要有*
int *c, *d, *e;

关于应该采用何种风格来定义指针的再分析

// 前边我们已经提到了,有几种定义指针的风格
// 其中最常见的是以下两种

// 方式一
int *pt1;

// 方式二
int* pt2;

// 那么哪一种更好呢?我们知道在定义的时候,需要给指针一个地址
int a = 100;
int *p1 = &a;

// 由于定义指针的时候,是需要给一个地址的
// 所以,我们也可以认为,这个类型应该是int*
// 这样来说的话,按照第二种方式写会更好一些
int* p2 = &a; // 也就是p2是一个int*类型,合情合理

// 但是关键的问题在于,当连续定义的时候,这个方式就不在合理了
int* pa, pb, pc; // pb, pc不是int*,仅仅只是int类型,不合理

// 此时,使用方式一更为合理,因为突出了*p是一个int类型
int *pc, *pd, *pe;

总结起来就是,两种方式都是各有优点,各有缺点,结果仍然是不相上下,难以给出一个固定选择。 

指针使用const限定

注:为了能够简单易懂,我们就以int为例

const int * p 指针p指向的地址的值不可以改变

int * const p 指针p指向的地址不可以改变为其他地址

const int * const p 指针p指向的地址和指向地址的值都不可以被改变

尤其是前两种方式,它们到底对应的是什么不可以被修改很容易被记错或弄混,一定要注意。

#include <iostream>

using namespace std;

int main()
{   
    int a = 100;
    int b = 150;

    // 情况1:const int * p,指针所指向的值不可以被改变

    const int * p1 = &a;

    // 修改指针所指向的地址对应的值是不被允许的
    // *p1 = 200;

    // 修改指针所指向的地址可以
    p1 = &b;
    cout << *p1 << endl;

    // 情况2:int * const p,指针所指向的地址不可以被改变

    // 修改指针所指向的地址对应的值可以
    int * const p2 = &a;
    *p2 = 200;
    cout << *p2 << endl;

    // 修改指针所指向的地址是不被允许的
    // p2 = &b;

    // 情况3:const int * const p
    // 指针所指向的地址和地址中的值都不可以被改变

    const int * const p3 = &a;
    // 现在,这两种修改都不被允许
    // *p3 = 200;
    // p3 = &b;
}

 2021-11-21更新:为了防止我没有说清楚,对于const限定指针,我再重复一次

1,如果const出现在星号的左边,那么表示被指的对象是常量。

2,如果const出现在星号的右边,那么表示指针本身是常量。

3,如果const同时出现在了星号的左边和右边,那么表示指针和被指的对象都是常量。

另外,如果const出现在的是星号的左边,那么无论const和类型谁先谁后,结果是一样的。

// 以下两种情况是完全一样的
// 而且这两种书写方式都被允许
const int * p1 = &a;
int const * p2 = &a;

点击查看全部c++教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值