您的位置:首页 > 编程语言 > C语言/C++

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

2014-12-31 01:26 155 查看
遥想当年英姿飒爽,羽扇纶巾。

就这样遥想遥想,就想到了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,到此结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 指针 内存