我正在研究一个使用指针算法的问题,我发现这个小代码段可行。我不清楚它到底在做什么。对我来说,它似乎是将缓冲区的地址+ ix3的值分配给数组元素a [i]。我不知道为什么那会与我的节目有关。有人可以告诉我这个循环中到底发生了什么吗?
int *buffer=new int[5*3];
for (i=0;i<5;i++)
a[i] = buffer+i*3;
答案 0 :(得分:2)
表达式
buffer+i*3
与
相同&buffer[i*3]
所以你的假设是正确的,我希望a[]
是一个指针数组。
请注意像buffer+k
这样的指针运算 not 取buffer
中包含的地址值并向其添加k:相反,它等于值&buffer[k]
,它应该等于buffer + k * sizeof中包含的地址值(缓冲区指向的类型)。
答案 1 :(得分:2)
它完全符合您的要求。数组a
(您未定义的定义)可能具有int* [5]
类型。
这样做的目的是启用正常的双索引(即不经常进行索引算法)。要了解这一点,请考虑访问a[1][2]
时会发生什么。在上述循环之后,a[1]
包含值buffer + 3
,即它指向buffer
的第四元素(将n
添加到指针移动指针n
元素转发)。因此,a[1][2]
与(buffer+3)[2]
相同,后者访问的值比buffer+3
点所指向的两个元素更远,换句话说,它等同于buffer[5]
。
更一般地说,在此初始化之后a[i][k]
访问与buffer[3*i+k]
相同的元素(当然,除非i
大于4)。
答案 2 :(得分:0)
buffer+i*3;
只是执行&buffer[i*3];
的迂回方式。