C++指针到指针简单使用会报错,记忆力下降没办法了

遥想当年英姿飒爽,羽扇纶巾。

就这样遥想遥想,就想到了c++的指针指针。好吧,趁着年纪未老就练练指针的指针吧。

何为指针的指针呢?

简单的说它存储的是另一个指针的地址。而指针存储的是变量的地址,这要区别开来饿。

还是不懂,好吧,不懂就是任性,unknow bitch.

int *p = nullptr; // 声明指针变量,它是整型,表明它指向的是一个类型为int的变量, 初始化为nullptr,nullptr是c++11新特性,推荐使用,为什么要初始化呢,呵呵,习惯而已。

int a = 100;

p = &a;  // 将a的地址赋给p,那么指针p就指向了变量a,这就是指针存储的是变量的地址。


下面声明下指针的指针:

int **pp = nullptr;  //用两个星号声明指针的指针。

接着上面吧;

pp = &p; //将指针p的地址赋给pp,就这样表明pp存储的是指针p的地址。

如果我们想通过pp 的改动去改变a的值,怎么办呢: 其实很简单一句搞定。

**p = 1000;

cout << a << endl;

这样就输出1000了,表明已经改变了a 的值。以下是具体点的,在main函数中添加:

    int *p = nullptr;

    int **pp = nullptr;

    int a = 2;

    p = &a;

    pp = &p;

    **pp = 1000;

    cout << a << " " <<  *p << " " << **pp << endl;

输出结果如下:

1000 1000 1000

Program ended with exit code: 0

好了,那说说我之前练习为什么报错吧,我是这样使用指针的指针的,我是想,通过函数,将一个指针作为参数传进去,

然后在该函数体内开辟内存空间,返回这个内存空间给穿进来的指针的,唠叨,说了那么多废话,都不知道你说啥?还是

用代码说话吧:

void allocate_f(int **p1)

{    

    *p1 = new (std::nothrow) int(100);    

}

int main()

{

    int **p = nullptr;

    allocate_f(p);    

    cout << **p << endl    

    return 0;

}

好就这样,本意是想通过allocate_f,然后将new出来的内存地址返回给p,接着打印出来。看看是否成功,如果

打印出的是100,就表示成功。command + B,编译,嗯成功没报错,可是我偏偏没想到, command + R,运行会出现以下情况:


啥,又是指针问题,发现问题所在了没?

是这样子的,我将p赋给了p1,因为p = nullptr,所以

p1 = nullptr,那么

*p1 也就是变成了*nullptr,这样理解了吧,*nllptr是报错,再不理解好吧,我们用下个例子说话;


int *p = null;

*p = 1000;

是不编译没报错,而运行就抱同样的错,起导致的原因都是一样的。

哎,刚开始我也不懂所以然,类似指针的使用出现这样的情况我是一般不会犯的,因为一眼就能看出来,

而到了指针的指针就不好说了,真如上面,就偏偏犯了这个错误,所以记下来,免得再犯。


那么想达到我要说的功能如何办呢?请看我这样使用:

void allocate_f(int **p1)

{

    

    *p1 = new (std::nothrow) int(100);

    

}


int main()

{

    int *p = nullptr;

    allocate_f(&p);

    cout << *p << endl;

    delete p;

    p = nullptr;    

    return 0;

}


结果输出:

100

Program ended with exit code: 0

ok,到此结束。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值