C 中指针类型转换如何工作

AuA*_*AuA 5 c pointers memory-management

据我了解,在c中,指针指向内存地址。在下面的代码中

char *cp;
someType *up; // Assuming that someType is a union of size 16 bytes
cp = sbrk(nu * sizeof(someType)); 

// Here is what confuses me
up = (someType *)cp;
Run Code Online (Sandbox Code Playgroud)

根据此链接http://en.wikibooks.org/wiki/C_Programming/Pointers_and_arrays

  1. 如果cp指向0x1234的地址,那么0x1234应该是新分配的内存的开头,对吧?

  2. 因此,当“cp”被转换为指向someType的指针并分配给“up”时,它实际上表示“up”是一个指向0x1234的指针,假设在32位系统中,每个内存地址占用4个字节,一个someType对象会使用4个内存地址来存储它的值,所以地址0x1234、0x1235、0x1236、0x1237共同存储了一个someType对象,这是正确的吗?

提前致谢。

Edw*_*uck 4

指针类型转换在机器级别不执行任何操作。内存中的值仍然只是内存中的普通旧值。

在语言级别,该值用作地址。换句话说,它经常用作传递给需要内存位置的操作的值,例如程序集“加载”操作。

在语言级别,额外的构造被添加到机器操作中,而这些“额外”之一就是数据类型。编译器负责检查是否存在类型规则违规,但在运行时不存在这样的约束。

因此,强制转换在运行时不执行任何操作,但在编译时它指示编译器不要发出错误,因为指针值的类型现在将被视为与保存地址的变量兼容的类型。

  • 是和不是。0x1234 是一个地址,仅此而已。它可能具有满足 Header 结构需求的数据,也可能不满足。强制转换告诉编译器将此地址视为满足 Header 结构体需求的地址。这满足了编译器的类型检查例程,但实际上对机器执行任何操作没有强烈的要求。该赋值确实需要机器执行某些操作,因此该赋值可能会创建一个内存移动操作,用伪英语来说就是“将 cp 的值存储到 up 中”,但转换通常会被优化为无。 (2认同)