在C(或C ++)中,是否可以创建一个数组a
(或者#34;看起来像#34;一个数组),这样a[0]
,{{1等等,都指向相同的内存位置?所以,如果你这样做
a[1]
然后a[0] = 0.0f;
a[1] += 1.0f;
将等于a[0]
,因为它与1.0f
的内存位置相同。
我确实有理由想要这样做。这可能不是一个好理由。因此,请将此问题视为纯粹出于好奇而被问及。
我应该说:我想这样做而不会超载[]运算符。其原因与避免动态调度有关。 (我已经告诉过你,我想要这样做的理由可能不是很好。没有必要告诉我,我不应该这样做。我已经知道了。)
答案 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。