小编Jos*_*een的帖子

printf和指针

可能重复:
正确的格式说明符打印指针(地址)?

使用时打印指针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++

22
推荐指数
1
解决办法
3万
查看次数

指针减法和替代

使用数组时,标准算法(在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.标准容器的迭代器可能(可能)具有相同的问题.

c c++ pointers

10
推荐指数
1
解决办法
728
查看次数

可以使用0来调用std :: search_n吗?

可以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++ stl-algorithm

7
推荐指数
1
解决办法
164
查看次数

在可能重叠的范围之间复制类

在C中,我们有功能memcpymemmove有效地复制数据.如果源和目标区域重叠,前者产生未定义的行为,但后者保证"按预期"处理,可能通过注意重叠的方向和(如果需要)选择不同的算法.

当然,上述函数在C++(as std::memcpystd::memmove)中可用,但它们并不适用于非平凡的事情class.相反,我们得到std::copystd::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 …

c++

6
推荐指数
1
解决办法
229
查看次数

std::Optional&lt;std::nullopt_t&gt; 如何操作?

这是一个愚蠢的问题,但我很好奇,但我还没有找到解释。建造 a 是否合法std::optional<std::nullopt_t>?如果你这样做了,你会怎样

std::optional<std::nullopt_t> x(std::nullopt);
Run Code Online (Sandbox Code Playgroud)

做?是否包含x值?

c++ c++17 stdoptional

3
推荐指数
1
解决办法
114
查看次数

标签 统计

c++ ×5

c ×2

c++17 ×1

pointers ×1

stdoptional ×1

stl-algorithm ×1