【问题标题】:Assigning a pointer to an integer分配指向整数的指针
【发布时间】:2012-05-16 08:54:06
【问题描述】:

我可以分配一个指向整数变量的指针吗?像下面这样。

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

pointer = &array1[0];

addressOfArray = pointer;

这样可以吗?

【问题讨论】:

  • 你试过了吗?
  • 您希望这样的作业能完成什么?告诉我们您要解决的实际问题,我们可以提供帮助。
  • 除非你有充分的理由,否则不要这样做。如果你这样做了,不要使用int,因为int 没有必要大到足以容纳所有系统上的指针(例如常见的LP64 and LLP64 models)。相反,请使用intptr_t

标签: c pointers assignment-operator


【解决方案1】:

没有明确的演员表,即

addressOfArray = (int) pointer;

还有这个警告:

6.3.2.3 指针
...
6 任何指针类型都可以转换为整数类型。除先前规定外, 结果是实现定义的。如果结果不能用整数类型表示, 行为未定义。结果不必在任何整数的值范围内 类型。

因此不能保证结果是有意义的整数值。

【讨论】:

  • 感谢您添加警告,我发现(并且被混淆)隐藏在 lua 实现中的此类代码。
  • 正确答案,但您可以包括 reason 为什么需要强制转换(@ouah 提到的对赋值运算符的约束)。
  • 最好使用 uintptr_t 类型而不是 int,因为它的实现定义的行为要少得多。
【解决方案2】:

没有。

您正在尝试将“指向 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;

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

【讨论】:

    【解决方案3】:

    在嵌入式编程中经常这样做,但有一些注意事项:

    • 该操作(很可能)需要强制转换,并且
    • 通常意味着您在没有操作系统的情况下工作或与 RTOS 密切合作(即驱动程序级开发)

    【讨论】:

    • 是吗?我从来没有这样做过,除非在实现pointer_to_string时。但是我已经对指针做了很多整数(字面量)。
    • 我的 ARM bsp 在启动过程中做了一些神奇的事情:“size = (unsigned)&__romend - (unsigned)&__romstart;”我在裸机应用程序中经常看到这种事情。
    • 当然,给猫科动物除毛的方法不止一种。另一个例子:我的 GreenHills RTOS 允许使用 Buffers 传递消息(它们的 Buffer 并不意味着简单的内存缓冲区)。要设置缓冲区,请执行以下操作:bufferControl.BufferType = DataBuffer | LastBuffer; bufferControl.TheAddress = (Address)&msgControl; bufferControl.Length = MAX_VAS_MESSAGE_SIZE; bufferControl.Transferred = 0; 由于Address 只是unsigned long int 的类型定义,因此会出现类似于 OP 问题的情况。
    • 是的,那是你需要做的另一次,写得很糟糕的库。但是诚实(相信我,我是一名软件工程师),你不需要这样做。除非你正在实现 print_pointer。如果您曾经写过演员表,请至少问自己 3 次是否必须这样做,然后再问 3 个其他人。只有这样才能考虑这可能是最好的方法。
    【解决方案4】:

    你可以这样做:

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

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

    【讨论】:

      【解决方案5】:

      不,将指针分配给整数是无效的。这是对赋值运算符 (C99, 6.5.16.1p1) 的约束违规。编译器有权拒绝翻译带有整数赋值指针的程序。

      【讨论】:

      • 你可以做演员,但我不推荐。
      猜你喜欢
      • 1970-01-01
      • 2017-02-12
      • 2020-04-19
      • 2018-05-16
      • 2011-04-02
      • 2012-01-23
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多