这不是一个我需要解决的问题,更多的是我犯了一个错误导致奇怪的输出,我很好奇发生了什么.
因此,如果point1是指向char"var"的指针,而point2是指向指针point1的指针,则正确地取消引用point2,如下所示:
cout << **point2 << endl;
Run Code Online (Sandbox Code Playgroud)
哪个会像预期的那样输出"y".
但是,如果我错误地取消引用指针,如下所示:
cout << *point2 << endl;
Run Code Online (Sandbox Code Playgroud)
然后输出将包括在初始变量var之后声明的任何后续变量.
例如,在下面的代码中,对于输出"yn",还包括var2,以及其他变量,例如
char var3 = 'a';
char var4 = 'b';
Run Code Online (Sandbox Code Playgroud)
似乎也包含在"ynab"的输出中.
我想我理解它是如何发生的,并通过以下方法输出每个变量的内存地址:
cout << (void *) &var <<endl;
Run Code Online (Sandbox Code Playgroud)
这证实了每个变量在内存中是相邻的,但是我不确定它为什么会发生.
为什么不正确地解引用指针的指针似乎返回连续的变量?
码:
#include <stdio.h>
#include <iostream>
using namespace std;
char var = 'y';
char var2 = 'n';
//Declare point1 as a pointer to a char
char* point1 = &var;
//Declare point2 as pointer to pointer to char
char** point2 = &point1;
int main(int argc, char **argv)
{
cout << "Dereference point1: " << *point1 << endl;
cout << "Dereference point2: " << **point2 << endl;
cout << "Bad dereference of point2: " << *point2 << endl;
cout << "Var: " << var << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
表达式*point2的类型char *被视为字符串.如果它不是真正的字符串那么你有未定义的行为,这真的是故事的结尾.
实际上发生的是输出操作符<<从内存中读取连续的字节,直到它达到零("字符串终结符").在您的情况下,编译器已将变量的存储放在彼此旁边,这就是为什么您看到两者都在"字符串"中输出.