有
any_type *ptr = (any_type*)malloc(sizeof(any_type)*size);
my_ptr = ptr+1;
memcpy(dst, my_ptr, sizeof(any_type));
my_ptr 会指向 ptr 之后的 1 个字节,还是指向 ptrsizeof(any_type)
之后的字节?对齐选项如何影响答案?有符号/无符号类型有什么不同吗?
有
any_type *ptr = (any_type*)malloc(sizeof(any_type)*size);
my_ptr = ptr+1;
memcpy(dst, my_ptr, sizeof(any_type));
my_ptr 会指向 ptr 之后的 1 个字节,还是指向 ptrsizeof(any_type)
之后的字节?对齐选项如何影响答案?有符号/无符号类型有什么不同吗?
指针算术是对指针的静态类型[*] 的大小进行的,因此它会有效地添加sizeof *ptr
. 成员的对齐方式将考虑到对象的大小,作为类型的对齐方式(对象末尾的填充)。
struct test {
int a;
char b;
};
如果类型是 4 字节对齐的,则的大小test
不会是 5(假设为 32 位整数)。
[*] 请注意,在 C++ 中,您可以将派生对象的地址分配给基类,但指针算术将对指针的类型进行操作,而不是实际对象:
struct base { int x; };
struct derived : base { int y; };
int main() {
base * p = new derived[10];
base * q = p+1; // this does not point to the second `derived`!!!
}
编译器会将该 1 替换为适当的字节数。您所要做的就是指定要移动到的对象的数量。
当你看到一个指针时,试着忘记它有一个标量值。相反,请认为指针是一种标记,可让您访问存储在连续空间(内存)中的对象。Ifptr
是一个指针,可让您访问某个(任意)位置的对象,ptr+1
并将ptr-1
返回可让您访问其邻居的指针。
为了使指针算法起作用,它必须指向 sizeof(any_type) + 基地址。