强制类型转换指针
在 C 语言中, 强制类型转换 是一种构造,用于临时将数据对象作为另一数据类型查看。
当您强制转换指针 (尤其是对于非数据对象指针) 时,请考虑以下特征和约束:
- 您可以将一个指针投向另一个相同 IBM i 指针类型的指针。注: 如果 ILE C 编译器检测到表达式中的类型不匹配,那么会发生编译时错误。
- 打开 (void) 指针可以存放任何类型的指针。 将打开的指针强制转换为其他指针类型,并将其他指针类型强制转换为打开的指针不会导致编译时错误。注: 如果指针包含不适合上下文的值,那么您可能会收到运行时异常。
- 将有效数据对象指针转换为有符号或无符号整数类型时,返回值是指针的偏移量。 如果指针为 NULL ,那么转换将返回值零 (0)。注: 无法确定转换是源自 NULL 指针还是具有偏移量 0 的有效指针。
- 将有效函数 (过程) 指针,系统指针,调用指针,标签指针或暂挂指针转换为带符号或无符号整数类型时,结果始终为零。
- 转换包含有效空间地址的打开指针时,返回值是该地址中包含的偏移量。
- 可以将整数转换为指针,但无法取消引用生成的指针值。 此类指针的右四个字节将包含原始整数值,此值可通过将指针转换回整数来恢复。注: 这将标记在较低版本的 ILE C 中显示的行为的更改,其中整数到指针的转换始终导致 NULL 指针值。
示例:
图 1 显示了 IBM i 指针强制类型转换:图 1。 显示 IBM® i 指针铸造的 ILE C 源代码
#include <pointer.h>
#pragma datamodel(p128)
#pragma linkage(TESTPTR, OS)
#pragma datamodel(pop)
void TESTPTR(void); /* System pointer to this program */
_SYSPTR sysp; /* System pointer */
_OPENPTR opnp; /* open pointer */
void (*fp)(void); /* function pointer */
int i = 1; /* integer */
int *ip = &i; /* Space pointer */
void main (void) {
fp = &main; /* initialize function pointer */
sysp = &TESTPTR; /* initialize system pointer */
i = (int) ip; /* segment offset stored in i */
ip = (int *) i; /* address stored is invalid */
i = (int) fp; /* zero is stored in i */
i = 2;
fp = (void (*)()) i; /* address stored is invalid */
i = 3;
sysp = (_SYSPTR) i; /* address stored is invalid */
opnp = &i; /* address of i stored in open pointer */
i = (int) opnp; /* offset of space pointer contained */
/* in open pointer is stored in i */
i = 4;
opnp = (_OPENPTR) i; /* address stored is invalid */
i = (int) opnp; /* i is set to integer value stored (4)*/
}