当(错误地)取消引用指针指针时,如何接收以下输出?

时间:2017-06-28 16:48:07

标签: c++ pointers

这不是一个我需要解决的问题,而是我犯了一个错误导致奇怪输出的情况,我很好奇发生了什么。< / p>

因此,如果point1是指向char&#34; var&#34;的指针,而point2是指向指针point1的指针,则按如下方式正确解引用point2:

cout << **point2 << endl;

哪个会输出&#34; y&#34;如预期的那样。

但是,如果我错误地取消引用指针,如下所示:

cout << *point2 << endl;

然后输出将包括在初始变量var之后声明的任何后续变量 例如,在下面的代码中,对于&#34; yn&#34;的输出,还包括var2,以及其他变量,例如

char var3 = 'a';
char var4 = 'b';

似乎也包含在&#34; ynab&#34;的输出中 我想我理解 它是如何发生的,并通过以下方法输出每个变量的内存地址:

cout << (void *) &var <<endl;

确认每个变量在内存中相邻,但我不确定为什么正在发生。

为什么不正确地解引用指针的指针似乎会返回连续的变量?

代码:

#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;
}

2 个答案:

答案 0 :(得分:9)

表达式*point2的类型为char *,它被视为字符串。如果它不是真正的字符串,那么你有未定义的行为,这真的是故事的结尾。

实际上发生的是输出运算符<<从内存中读取连续的字节,直到它达到零(“字符串终结符”)。在您的情况下,编译器已将变量的存储放在彼此旁边,这就是为什么您看到两者都在“字符串”中输出。

答案 1 :(得分:3)

C ++认为指向char 的指针是字符串的开头。因此它会尝试继续打印,直到找到NULL值。