遥想当年英姿飒爽,羽扇纶巾。
就这样遥想遥想,就想到了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,到此结束。