Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;地址存在吗?_C++_Arrays_Pointers - Fatal编程技术网

C++ C++;地址存在吗?

C++ C++;地址存在吗?,c++,arrays,pointers,C++,Arrays,Pointers,假设我在C++中有以下内容: char buffer[SIZE]; char * ptr = &buffer[SIZE]; 其中,ptr的值永远不会被取消引用。这是合法的C++吗?也就是说,使用距数组最后一个元素一步的内存地址(例如作为要比较的特殊值)?您的意思是&buffer[SIZE]?是的,它在C++中是合法的。ptr的值是缓冲区的一个过去端点,大多数标准算法可以将其用作缓冲区的end()迭代器。如果您说: char buffer[SIZE]; char * ptr = &

假设我在C++中有以下内容:

char buffer[SIZE];
char * ptr = &buffer[SIZE];

其中,
ptr
的值永远不会被取消引用。这是合法的C++吗?也就是说,使用距数组最后一个元素一步的内存地址(例如作为要比较的特殊值)?

您的意思是
&buffer[SIZE]
?是的,它在C++中是合法的。ptr的值是缓冲区的一个过去端点,大多数标准算法可以将其用作缓冲区的end()迭代器。

如果您说:

char buffer[SIZE];
char * ptr = & buffer[SIZE];
那么是的,这是合法的。C++允许您使用数组中的结尾,在使用迭代器时使用广泛。 编辑:但请参见litb和Steve Jessop的评论。如果你想在政治上完全正确,你可能需要:

char * ptr = buffer + SIZE;

无论哪种方式,超过结束地址的地址都是有效的地址-可能不太清楚的问题(据我所知)是是否允许取消引用它。

这是否编译?应该是
char*ptr=&buffer[SIZE]?可能重复:您在说
缓冲区[大小]
时取消了引用。。。从形式上讲,这是一个灰色区域,但我从未见过任何编译器会做任何出乎意料的事情。@litb:这不是灰色区域。标准显式允许获取地址,但取消引用该地址是显式未定义的行为。@John,但使用[]会取消引用它!我想应该说
缓冲区+大小
而不是
&buffer[SIZE]
。事实上,许多STL算法的实现都依赖于这个保证。@John:哪些STL算法的实现依赖于执行
&*(ptr+offset)
?它们都不处理数组和偏移量,而是处理迭代器(因此有时处理指针)。地址
buffer+SIZE
肯定很好,这在指针添加的定义中得到了明确的处理。问题在于中间左值
*(缓冲区+大小)