强制类型转换指针

在 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)*/
}