我是使用C ++进行复杂编程的新手。我一直在筛选通过我的部门传下来的一些遗留的,没有注释的学术代码,我偶然发现了一些我不知道如何谷歌的东西。我不理解引用结构数组的语法。
以下是我正在努力的修剪版本:
typedef struct
{
double x0,y0;
double r;
} circle;
double foo()
{
int N = 3;
double mtt;
circle circles[N];
for (int i = 0; i < N; i++)
{
mtt += mtt_call_func((circles+i), N);
}
return mtt;
}
(circles+i)
在这种情况下意味着什么?
编辑:该函数应该有(circles + i)
,而不是(circle + i)
。
答案 0 :(得分:3)
circles+i
相当于&circles[i]
。这就是指针算术在C ++中的工作原理。
为什么有指针?好吧,当你在&circles
或sizeof circles
以外的上下文中给出数组的名称时,会创建一个指向数组第一个成员的临时指针。这就是你的代码的工作原理。数组是C ++中的二等公民;它们的行为不像是物体。
(我假设你的circle+i
是circles+i
的拼写错误,正如其他人所建议的那样)
答案 1 :(得分:2)
circle+i
表示“取一个指针圈并按其指向的对象大小移动它”。指针是涉及的,因为数组的名称是指向它的第一个元素的指针。
除此之外,你应该初始化循环中使用的整数计数器变量:
for (int i = 0; i < N; i++)
^^^^
{
mtt += mtt_call_func( ( circles + i), N);
^ // typo
}
答案 2 :(得分:1)
在C中,与在C ++中一样,将数组视为指针是合法的。因此,circles+i
将i
的{{1}}大小增加到circle
的地址。
写circles
可能更清楚;在这种形式中,表达式更明显地产生一个指向数组中第i个结构的指针。
答案 3 :(得分:0)
你在堆栈中声明的每个向量它实际上是指向向量的第一个索引0的指针。使用i,您可以从索引移动到索引。因此,(circles+i)
相当于&circles[i]
。
&
表示变量的地址。在函数调用中,您发送一个存储变量地址的指针,因此如果您要更改为&
,则需要circles[i]
,因为您需要i的地址向量的索引圈来运行你的函数。
有关指针,向量和结构的更多信息,请查看:http://pw1.netcom.com/~tjensen/ptr/pointers.htm
它应该通过地面基础来覆盖你。