C++干净的指针算术

exc*_*bur 1 c++ linux pointers

什么是在C++中执行指针运算最干净的方法?我正在尝试将n字节添加到地址.

int *foo;
foo = static_cast<int*> (static_cast<unsigned int>(foo) + sizeof(T))
Run Code Online (Sandbox Code Playgroud)

之后你可以重铸并以不同的方式使用foo

char* somestr = reinterpret_cast<char*>(foo)
Run Code Online (Sandbox Code Playgroud)

这够好吗?现在我理解指针实现dosent保证所有指针(char*,int*)都实现相同的大小.所以不确定是否int*(应该是foo*)并且使用unsigned int进行数学运算是最干净的解决方案.此外,它必须兼容32位和64位.

没关系为什么我这样做.虽然不是那么不寻常.当您使用动态解释为不同类型的数据流(或字节池)时,您将遇到此问题.

Kon*_*lph 12

最简洁的指针运算方式不是通过字节数,而是强类型.不要将int数组视为其他内容,只是直接偏移:

int* next = foo + n;
Run Code Online (Sandbox Code Playgroud)

要么:

int* next = &foo[n];
Run Code Online (Sandbox Code Playgroud)

两者都优于您的铸造解决方案.

如果您使用字节缓冲区,请使用char*,而不是(从不!)int*.那是,

char* buffer = get_the_buffer();

// Pointer arithmetic uses sizeof(char) == 1
Run Code Online (Sandbox Code Playgroud)

如果你真的需要在非字节数组中逐字递增,首先要问问自己为什么要这么做.然后,转换char*并执行指针运算; 也不会投给int或者其他整数类型:

char* foo_buffer = reinterpret_cast<char*>(foo);
char* whatever = foo_buffer + n;
Run Code Online (Sandbox Code Playgroud)

而不是char你也可以使用unsigned char哪个可以说更有意义来表示字节,但对指针算术没有影响.但是要注意对齐:您不能再使用原始类型可靠地访问递增的指针.访问未对齐的内存是严格未定义的行为(= !).在最好的情况下,它很慢.在最糟糕的情况下,它崩溃了.

不用说,所有这一切是非常低的水平.这种代码几乎没有用处.即使是低级库也应该优先使用C++标准库工具来实现这种代码,特别是指针算法的用途越来越少.

  • @excalibur你被告知错了(或者你被误解了),这句话毫无意义.任意内存位置的`int*`总是错误的.`int*`表示一件事,只有一件事:"指向一个或多个`int`的连续块的指针".`void*`在这里也是错误的; 唯一的目的是提供类型擦除.它*不能与指针算术一起使用(只需尝试它!).**`char*`是这里唯一正确的类型**,不要被愚蠢的类型名称误导.在C++中,`char`是(不存在的)类型`byte`的别名. (2认同)