C 将指针指定给整数

C 将指针指定给整数,c,pointers,assignment-operator,C,Pointers,Assignment Operator,我可以为整型变量指定指针吗?像下面这样 int *pointer; int array1[25]; int addressOfArray; pointer = &array1[0]; addressOfArray = pointer; 可以这样做吗?不,将指针指定给整数是无效的。它违反了赋值运算符(C99,6.5.16.1p1)的约束。编译器有权拒绝翻译指针指向整数赋值的程序。您可以这样做: memcpy(&addressOfArray, &pointer, siz

我可以为整型变量指定指针吗?像下面这样

int *pointer;
int array1[25];
int addressOfArray;

pointer = &array1[0];

addressOfArray = pointer;

可以这样做吗?

不,将指针指定给整数是无效的。它违反了赋值运算符(C99,6.5.16.1p1)的约束。编译器有权拒绝翻译指针指向整数赋值的程序。

您可以这样做:

memcpy(&addressOfArray, &pointer, sizeof(int));

它将直接复制底层字节并取代强制转换操作符,但我绝对不推荐使用它,除非您确定系统上的
sizeof(int)==sizeof(int*)

嵌入式编程中经常使用它,但有一些注意事项:

  • 操作(很可能)需要浇铸,以及
  • 通常意味着您在没有操作系统的情况下工作,或者与RTO密切合作(即,驱动程序级开发)
  • 您正试图将“指向int的指针”值分配给“int”变量。您肯定会收到编译器警告。你可以做:

    int *pointer;
    int array1[25];
    int *addressOfArray;
    
    pointer = &array1[0];
    //The following commented lines are equivalent to the pointer assignment above and are also valid
    //pointer = array
    //pointer = &array[0]
    
    addressOfArray = pointer;
    

    这被称为浅拷贝。如果您还不熟悉这个概念,我强烈建议您阅读它(谷歌“深度与浅层复制”)。

    没有明确的转换,即

    addressOfArray = (int) pointer;
    
    还有一个警告:

    6.3.2.3指针

    6任何指针类型都可以转换为整数类型。除非之前另有规定,否则 结果是定义了实现。如果结果不能用整数类型表示, 该行为未定义。结果不必在任何整数的值范围内 类型。
    因此,结果不能保证是一个有意义的整数值

    你试过了吗?你希望这样的任务能完成什么?告诉我们你想解决什么实际问题,我们可以帮你解决。除非你有充分的理由,否则不要这样做。如果这样做,不要使用
    int
    ,因为
    int
    不一定足够大,无法在所有系统(例如公共系统)上容纳指针。你可以做演员,但我不推荐。是吗?我从来没有这样做过,除了在实现指针到字符串时。然而,我对指针做了很多整型(文字)操作。我的ARM bsp在引导过程中发挥了一些神奇的作用:“size=(无符号)&&uuuuRomend-(无符号)&&uuuRomstart;”我在裸机应用程序中经常看到这种情况;外部内部8*;大小\u t大小=\uuuuuRoMend-\uRomStart如果指针是正确的类型,你只需从另一个指针中减去一个就可以得到一些答案,如@Throwback1986。当然,有不止一种方法可以解决猫的问题。另一个例子:我的GreenHills RTOS允许使用缓冲区进行消息传递(它们的缓冲区并不意味着一个简单的内存缓冲区)。要设置缓冲区,可以执行以下操作:
    bufferControl.BufferType=DataBuffer | LastBuffer;bufferControl.TheAddress=(地址)&msgControl;bufferControl.Length=最大消息大小;bufferControl.transfered=0
    由于
    Address
    只是
    unsigned long int
    的一个typedef,因此出现了类似于OP问题的情况。是的,这是您需要做的另一次,编写糟糕的库。但是老实说(相信我,我是一名软件工程师),你不需要这么做。除非您正在实现print_指针。如果你曾经写过一个演员阵容,那么如果必须的话,至少问问你自己3次,然后再问问其他3个人。只有考虑到它可能是最好的方法。感谢添加警告,我发现(并且被混淆)这样的代码隐藏在一个LUA实现中。正确的答案,但是你可以包括为什么强制转换是必要的(对AUAH提到的赋值操作符的约束)。应该使用类型
    uintptr\u t
    而不是
    int
    ,因为它具有更少的实现定义行为。