可能重复:
正确的格式说明符打印指针(地址)?
使用时打印指针printf,是否需要将指针强制转换为void *?换句话说,在代码中
#include <stdio.h>
int main() {
int a;
printf("address of a = %p\n", &a);
}
Run Code Online (Sandbox Code Playgroud)
这个论点应该真的(void *) &a吗? gcc当没有明确的演员表时,似乎没有给出任何警告.
使用数组时,标准算法(在C和C++中)通常会返回指向元素的指针.有时可以方便地获得元素的索引,也许是为了索引到另一个数组,我通常通过从指针中减去数组的开头来得到它:
int arr[100];
int *addressICareAbout = f(arr, 100);
size_t index = addressICareAbout - arr;
Run Code Online (Sandbox Code Playgroud)
这总是看起来简单而有效.然而,最近我指出,指针减法实际上返回a ptrdiff_t,原则上,如果" index"不适合a ,则可能存在问题ptrdiff_t.我真的不相信任何实施都会有足够的反复意义,允许人们创建如此大的arr(从而引起这样的问题),但是这里接受的答案承认这是可能的,而且我没有找到任何证据表明不这样做.因此,我已经辞职了(除非有人能说服我),并且会小心前进.这个答案提出了一种"安全"获取索引的相当复杂的方法; 真的没有更好的吗?
也就是说,我对C++中可能的解决方法感到困惑.我们有std::distance,但std::distance(arr, addressICareAbout)保证定义明确?一方面,(指向第一个元素的指针)arr可以递增到达addressICareAbout(右?),但另一方面std::distance应该返回a ptrdiff_t.标准容器的迭代器可能(可能)具有相同的问题.
可以std::search_n用一个"安全"之称count的0?具体来说,代码如下有效吗?
#include <algorithm>
#include <cstdio>
int main(int argc, char *argv[]) {
const int test[7] = {1, 2, 3, 4, 5, 6, 7};
const int *const location = std::search_n(test, test + 7, 0, 8);
if (location == test) {
std::puts("Found it at the beginning!");
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这段代码能够达到这个std::puts陈述,而大多数的描述std::search_n似乎暗示它会.但是,我发现的大多数示例实现都不会.什么说标准?
在C中,我们有功能memcpy并memmove有效地复制数据.如果源和目标区域重叠,前者产生未定义的行为,但后者保证"按预期"处理,可能通过注意重叠的方向和(如果需要)选择不同的算法.
当然,上述函数在C++(as std::memcpy和std::memmove)中可用,但它们并不适用于非平凡的事情class.相反,我们得到std::copy和std::copy_backward.如果源和目标范围不重叠,则每个都有效; 而且,每个都保证适用于重叠的一个"方向".
如果我们想要从一个区域复制到另一个区域,我们可以使用什么?我们在编译时不知道范围是否可能重叠或者可能出现重叠的方向? 我们似乎没有选择.对于一般情况iterator,可能很难确定范围是否重叠,所以我理解为什么在这种情况下没有提供解决方案,但是当我们处理指针时呢? 理想情况下,有一个功能,如:
template<class T>
T * copy_either_direction(const T * inputBegin, const T * inputEnd, T * outputBegin) {
if ("outputBegin ? [inputBegin, inputEnd)") {
outputBegin += (inputEnd - inputBegin);
std::copy_backward(inputBegin, inputEnd, outputBegin);
return outputBegin;
} else {
return std::copy(inputBegin, inputEnd, outputBegin);
}
}
Run Code Online (Sandbox Code Playgroud)
(T *替换的类似功能std::vector<T>::iterator也会很好.如果保证能够正常工作inputBegin == outputBegin,那就更好了,但这是我的另一个抱怨.)
不幸的是,我没有看到在if语句中写入条件的合理方法,因为将指针与单独的内存块进行比较通常会产生未定义的行为.另一方面,实施显然有自己的方法来实现这一点,因为std::memmove …
这是一个愚蠢的问题,但我很好奇,但我还没有找到解释。建造 a 是否合法std::optional<std::nullopt_t>?如果你这样做了,你会怎样
std::optional<std::nullopt_t> x(std::nullopt);
Run Code Online (Sandbox Code Playgroud)
做?是否包含x值?