定义一个C数组,其中每个元素都是相同的内存位置

时间:2014-02-28 09:55:52

标签: c++ c arrays

在C(或C ++)中,是否可以创建一个数组a(或者#34;看起来像#34;一个数组),这样a[0],{{1等等,都指向相同的内存位置?所以,如果你这样做

a[1]

然后a[0] = 0.0f; a[1] += 1.0f; 将等于a[0],因为它与1.0f的内存位置相同。

我确实有理由想要这样做。这可能不是一个好理由。因此,请将此问题视为纯粹出于好奇而被问及。

我应该说:我想这样做而不会超载[]运算符。其原因与避免动态调度有关。 (我已经告诉过你,我想要这样做的理由可能不是很好。没有必要告诉我,我不应该这样做。我已经知道了。)

5 个答案:

答案 0 :(得分:3)

我想这样的课程就是你需要的课程

template <typename T>
struct strange_array
{
   T & operator [] (int) { return value; }
private:
   T value;
};

答案 1 :(得分:2)

您始终可以定义指向同一变量的指针数组:

typedef int* special;
int i = 0;
unsigned int var = 0xdeadbeef;
special arr[5];

for (i=0; i<5; i++)
    arr[i] = &var;

*(arr[0]) = 0;
*(arr[3]) += 3;

printf("%d\n", *(arr[2]));
// -> 3

答案 2 :(得分:0)

在C中,我不这么认为。

表达式a[i]仅表示*(a + i),因此由于索引而难以避免添加。

您可以通过将a(数组名称)作为宏来粘合某些内容,但我不确定如何:您无法访问索引以便对其进行补偿。

答案 3 :(得分:0)

没有超载operator[]

不,这是不可能的。

幸运的。

答案 4 :(得分:0)

在这里的所有对话中,我现在理解如下问题:

您希望拥有数组的语法,例如

a[n]     // only lookup 
a[n]++   // lookup and write

但您希望将语义更改为所有这些映射到同一元素,如

a[0]
a[0]++

实现这一目标的C ++方法是IMHO重载索引访问操作符[]。 但是,出于性能原因,你不想要它。

我加入了Orbit用户Lightness Races的观点,你不能在C ++中做到这一点。

由于您未提供有关用例的更多信息,因此很难找到解决方案。 我能想象的最好的是你有很多使用数组语义的编写代码,你无法改变它们。

剩下的东西(想要保持性能)是代码转换技术(CPP,sed,..),从给定的源代码生成具有所需行为的源代码,例如,通过强制所有索引值为0。