指针表现得很奇怪

Per*_*on1 3 c c++ pointers

我是编程和c ++新手.我很感激这方面的一些帮助.

以下程序(在c ++中)在编译或运行时都不会遇到任何问题:

int main()
{
    int b = 5;
    int*a = &b;
    *(a+5) = 6;
    return 0;

}
Run Code Online (Sandbox Code Playgroud)

但根据我所学到的一切,它应该不起作用,因为a是指向单个变量的指针.我在这里错过了什么?

Cas*_*Cow 6

您的程序在编译时确实不会遇到任何问题.它是关于编译的所有有效代码.

但是,它将在运行时遇到未定义的行为,因为a+5它不是有效的地址.

如果你想知道它为什么要编译,你可以编写如下代码:

int func( int * buf, size_t size )
{
    for( size_t i = 0; i < size; ++i )
    {
       *(buf + size) = static_cast<int>(i); // or (int)i in C
    }
}

int main()
{
   int buf[ 6 ];
   func( buf, 6 );
}
Run Code Online (Sandbox Code Playgroud)

在你的代码中a是一个指向内存的指针.a + 5表示从a点开始的地址5"整数" .正如a指向一个整数b,不能保证这样的地址.有趣的是,a+1即使它指向内存中你不应该读取或写入的位置,也可以很好地定义它.但是指针本身有一些保证,即它会大于a并且如果你从它中减去1,你将会回到它a,如果你在它之间做一个ptrdiff,a你将得到1.但这只是"一个特殊属性"过去结束"允许程序员指定内存范围.