作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在阅读指针在 C++ 中的工作原理,我试图稍微弄乱它,但程序停止工作了。
#include <iostream>
using namespace std;
int main ()
{
char a[] = "Hello";
char * b = a;
char ** c = &b;
cout << *(b+1) << endl;
//cout << **(c+2) << endl;
return 0;
}
如果注释行未被注释,程序将停止工作,错误代码:0xC0000005。我做错了什么还是这是某种错误?
最佳答案
这里:
char a[] = "Hello";
char * b = a;
您正在利用数组到指针的衰减。所以现在 b
指向 a[0]
。也就是说,b
保存着 a[0]
然后
char ** c = &b;
c
现在指向 b
的地址,它本身就是一个指针。 c 保存了 b
的地址,它保存了 a
的地址(明白为什么现在人们讨厌指针了吗?)
如果你想从c
访问a[0]
,你首先需要取消引用它:
*c
它给出 b
,然后我们需要取消引用 that 以返回到 a[0]
:
*(*c)
如果你想使用指针算法访问a[1]
,你想递增b
,所以:
*c+1
现在我们有了 a[1]
的地址,如果我们想打印它,我们需要再次取消引用:
*(*c+1)
当你说:
**(c+2)
c
保存了 b
的地址,而不是 a
,因此对其递增会导致未定义的行为。
关于c++ - 如何在C++中增加指针的指针值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34515367/
我是一名优秀的程序员,十分优秀!