【问题标题】:C Store array element address in other elementC 将数组元素地址存储在其他元素中
【发布时间】:2014-04-22 02:04:31
【问题描述】:

我将使用什么数据类型来存储数组中其他元素的地址。

如,数组的元素 0 具有元素 5 的地址。以此类推..

【问题讨论】:

  • 使用 size_t(即 int)元素并存储 index. 将其添加到数组地址中。

标签: c types addressing


【解决方案1】:

元素的地址与元素的数据类型不同。所以你的代码将不得不涉及一些类型转换。

用最少的演员来做到这一点:

T some_object;

void *array[20];
array[0] = &some_object;
array[5] = &array[0];

// ....

T *some_ptr = *(void **)array[5];

【讨论】:

  • @Peter,这将依赖于 void *T * 具有相同的表示和对齐要求。
  • 它也错过了一个间接。顺便说一句,所有这些都只是实现定义的,不是吗?
  • 我也不确定 OP 是否想要包含一个单独的 T。我的直觉是递归自引用到类型系统的投影是这里的重点。因为实际上一个元素可以持有 ******T,如果指向足够远的话。
  • 我的版本是明确定义的,任何指针都可以转换为void *,然后检索原始指针。但是,如果 OP 打算拥有更长的指针链,我的版本就没那么有用了,在这种情况下,他可能最好使用你的想法并做出这个假设。
  • 感谢您提供有关 void * 的信息。
【解决方案2】:

指针可以转换为int(或者long,如果您正在使用64位并且您的c编译器将long定义为64位)。然后你只需要获取你试图指向的元素的地址。

int test[10];
test[0] = (int)&test[5];

【讨论】:

  • intptr_t 可能是更好的类型选择,因为该类型保证能够保存指针值。
  • 那不是uintptr_t吗?
  • 我不会编辑,我基本上必须重写整个帖子:) intptr_t 是在系统上定义的,当且仅当有一个足够大的整数类型时。 AFAIK 使用这个和uintptr_t 没有区别
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 2019-08-16
  • 1970-01-01
  • 2017-10-25
  • 2013-04-30
  • 2011-03-24
  • 2023-03-21
相关资源
最近更新 更多