C++ 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 = &
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
肯定很好,这在指针添加的定义中得到了明确的处理。问题在于中间左值*(缓冲区+大小)
。