C 指针和类型转换

C 指针和类型转换,c,pointers,casting,type-conversion,C,Pointers,Casting,Type Conversion,对或错: 以下作业有效: #define GIMME *(unsigned int**) 0x3000 unsigned short d = 42; GIMME = &d; 这是错误的,尽管我不明白为什么。我最近已将Java转换为C,因此我们将非常感谢您的帮助。代码尝试了两个有问题的东西: 将数据分配到未知有效的位置(3000) *(unsigned int**) 0x3000 = &d; 正在尝试分配不兼容的类型。对齐可能会失败,因为unsigned short可能

对或错: 以下作业有效:

#define GIMME *(unsigned int**) 0x3000 
unsigned short d = 42; 
GIMME = &d;

这是错误的,尽管我不明白为什么。我最近已将Java转换为C,因此我们将非常感谢您的帮助。

代码尝试了两个有问题的东西:

  • 将数据分配到未知有效的位置(3000)

    *(unsigned int**) 0x3000  = &d;
    
  • 正在尝试分配不兼容的类型。对齐可能会失败,因为
    unsigned short
    可能比
    unsigned int
    窄。鉴于此,这两种类型可能有不同的最低对齐要求

  • 指向对象类型的指针可以转换为指向不同对象类型的指针。如果结果指针与引用的类型未正确对齐,则行为未定义。C11§6.3.2.3 7


    代码正在尝试两个有问题的事情:

  • 将数据分配到未知有效的位置(3000)

    *(unsigned int**) 0x3000  = &d;
    
  • 正在尝试分配不兼容的类型。对齐可能会失败,因为
    unsigned short
    可能比
    unsigned int
    窄。鉴于此,这两种类型可能有不同的最低对齐要求

  • 指向对象类型的指针可以转换为指向不同对象类型的指针。如果结果指针与引用的类型未正确对齐,则行为未定义。C11§6.3.2.3 7


    你如何定义“有效”?如果这些行位于函数定义中,则看起来是正确的。整数
    0x3000
    将以实现定义的方式转换为指针,
    无符号短
    无符号整数
    可能具有相同的对齐要求。您想做什么?这不是您要查找的代码。换一本好的C语言书。@MikeCAT:但是
    unsigned short*
    unsigned int*
    是不同的类型,如果没有显式强制转换,就不能将一种类型分配给另一种类型。强制转换的
    GIMME
    需要是
    (unsigned short**)
    ,或者
    &d
    需要强制转换为
    unsigned int*
    。要在措辞上说明这一点,没有显式/隐式强制转换,因为“强制转换”是隐式显式的。另一件事叫做“隐式转换”:
    charc='a';int i=c;/*这里从char到int的隐式转换*/
    如何定义“valid”?如果这些行位于函数定义中,则看起来是正确的。整数
    0x3000
    将以实现定义的方式转换为指针,
    无符号短
    无符号整数
    可能具有相同的对齐要求。您想做什么?这不是您要查找的代码。换一本好的C语言书。@MikeCAT:但是
    unsigned short*
    unsigned int*
    是不同的类型,如果没有显式强制转换,就不能将一种类型分配给另一种类型。强制转换的
    GIMME
    需要是
    (unsigned short**)
    ,或者
    &d
    需要强制转换为
    unsigned int*
    。要在措辞上说明这一点,没有显式/隐式强制转换,因为“强制转换”是隐式显式的。另一件事叫做“隐式转换”:
    charc='a';int i=c;/*此处从char到int的隐式转换*/