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

C++ 定义一个C数组,其中每个元素都是相同的内存位置,c++,c,arrays,C++,C,Arrays,在C(或C++)中,是否可以创建一个数组a(或“看起来”像数组的东西),使得a[0]、a[1]等都指向相同的内存位置?所以如果你这样做了 a[0] = 0.0f; a[1] += 1.0f; 然后a[0]将等于1.0f,因为它与a[1]是相同的内存位置 我想这样做是有原因的。这可能不是个好理由。因此,请把这个问题当作纯粹出于好奇而提出 我应该说:我希望在不重载[]操作符的情况下完成此操作。这样做的原因与避免动态调度有关。(我已经告诉过你我想做这件事的原因可能不是很好。没有必要告诉我我不想做。我

在C(或C++)中,是否可以创建一个数组
a
(或“看起来”像数组的东西),使得
a[0]
a[1]
等都指向相同的内存位置?所以如果你这样做了

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

我想这样做是有原因的。这可能不是个好理由。因此,请把这个问题当作纯粹出于好奇而提出


我应该说:我希望在不重载[]操作符的情况下完成此操作。这样做的原因与避免动态调度有关。(我已经告诉过你我想做这件事的原因可能不是很好。没有必要告诉我我不想做。我已经知道了。)

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

template <typename T>
struct strange_array
{
   T & operator [] (int) { return value; }
private:
   T value;
};
模板
结构奇异数组
{
T运算符[](int){返回值;}
私人:
T值;
};

我想像这样的类正是您所需要的

template <typename T>
struct strange_array
{
   T & operator [] (int) { return value; }
private:
   T value;
};
模板
结构奇异数组
{
T运算符[](int){返回值;}
私人:
T值;
};

在C语言中,我不这么认为

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


通过将
a
(数组名)设置为宏,您可能可以将某些内容粘合在一起,但我不确定如何操作:您将无法访问索引以补偿它。

在C中,我不这么认为

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


通过将
a
(数组名称)设置为宏,您可能可以将某些内容粘合在一起,但我不确定如何操作:您将无法访问索引以补偿它。

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

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
typedef int*特殊;
int i=0;
无符号int var=0xdeadbeef;
特殊arr[5];
对于(i=0;i=3

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

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
typedef int*特殊;
int i=0;
无符号int var=0xdeadbeef;
特殊arr[5];
对于(i=0;i=3

不重载
运算符[]

不,这是不可能的。


幸运的是。

没有重载
运算符[]

不,这是不可能的。


幸运的是。

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

您需要数组的语法,例如

a[n]     // only lookup 
a[n]++   // lookup and write
但您希望将语义更改为所有这些映射到同一元素,如

a[0]
a[0]++

实现C++的方法是超负荷索引访问运算符[]。 但是,出于性能原因,您不需要它

<>我加入了轨道上的用户轻量竞赛,你不能在C++中这样做。 由于您没有提供关于用例的更多信息,因此很难提出解决方案。 我能想象的最好的情况是,您有很多使用数组语义的书面代码,您不能更改这些代码


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

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

您需要数组的语法,例如

a[n]     // only lookup 
a[n]++   // lookup and write
但您希望将语义更改为所有这些映射到同一元素,如

a[0]
a[0]++

实现C++的方法是超负荷索引访问运算符[]。 但是,出于性能原因,您不需要它

<>我加入了轨道上的用户轻量竞赛,你不能在C++中这样做。 由于您没有提供关于用例的更多信息,因此很难提出解决方案。 我能想象的最好的情况是,您有很多使用数组语义的书面代码,您不能更改这些代码


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

不,那么它不是一个数组。理解正在发生的事情也会非常混乱,甚至可能在几个月后回到这里时对你来说也是如此。联合是一个类似的概念。当你使用联合时,你指的是o具有不同成员名称的相同内存位置。因此,您可以将联合的成员定义为2个不同的成员arrays@molbdnilo:您是否尝试过
#定义10
运算符。这样做的原因与避免动态调度有关。
它不需要涉及动态调度……您所说的“动态调度”是什么意思?它与用户定义的
运算符[]
有什么关系?不必因间接(虚拟方法调用)而产生任何开销,请参阅。不,那么它不是一个数组。理解正在发生的事情也会非常混乱,可能对你来说也是如此。联合是一个类似的概念。当你使用联合时,你使用不同的成员名称引用相同的内存位置。因此你可以将联合的成员定义为2个不同的成员新界arrays@molbdnilo:您是否尝试过
#定义10
我希望在不重载[]运算符的情况下执行此操作。原因与避免动态调度有关。
不需要涉及动态调度……您认为“动态调度”是什么意思它与用户定义的
运算符[]
有什么关系?间接寻址(虚拟方法调用)不一定会产生任何开销,请参阅。返回对
值的引用是否足够?@Lumen:当然,但是,