C++;引用结构数组 我对使用C++进行复杂编程是新手。我一直在筛选一些遗留下来的、未注释的学术代码,这些代码是通过我的系传下来的,我偶然发现了一些我不知道如何在谷歌上搜索的东西。我不理解引用结构数组的语法

C++;引用结构数组 我对使用C++进行复杂编程是新手。我一直在筛选一些遗留下来的、未注释的学术代码,这些代码是通过我的系传下来的,我偶然发现了一些我不知道如何在谷歌上搜索的东西。我不理解引用结构数组的语法,c++,arrays,struct,C++,Arrays,Struct,以下是我正在努力解决的问题的精简版本: 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); } re

以下是我正在努力解决的问题的精简版本:

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;
}
typedef结构
{
双x0,y0;
双r;
}圆圈;
双福()
{
int N=3;
双mtt;
圆圈[N];
对于(int i=0;i
在这种情况下,
(圆圈+i)
是什么意思


<>编辑:函数应该有<代码>(圆+i)<代码>,而不是<代码>(圈+i)< /> >

在C中,如同C++一样,把数组当作指针是合法的。因此
circles+i
i
乘以
circle
的大小添加到
circles
的地址中


&圈[i]
可能更清楚;在这种形式下,表达式在数组中生成指向IthStutt的指针更为明显。C中的

< P>,就像C++一样,把数组当作指针是合法的。因此
circles+i
i
乘以
circle
的大小添加到
circles
的地址中


&圈[i]
可能更清楚;在这种形式中,更明显的是,表达式生成指向数组中第i个结构的指针。

circles+i
相当于
&circles[i]
。这就是指针运算在C++中如何工作。

为什么会有指针?好的,当您在
&circles
sizeof circles
以外的上下文中给出数组的名称时,将创建一个指向数组第一个成员的临时指针;这就是你的代码的工作原理。数组是C++中的二等公民;它们的行为不像物体


(我假设你的
circle+I
是其他人建议的
circles+I
的打字错误)

circles+I
等同于
&circles[I]
。这就是指针运算在C++中如何工作。

为什么会有指针?好的,当您在
&circles
sizeof circles
以外的上下文中给出数组的名称时,将创建一个指向数组第一个成员的临时指针;这就是你的代码的工作原理。数组是C++中的二等公民;它们的行为不像物体


(我假设你的
circle+I
是其他人建议的
circles+I
打字错误)

circle+I
的意思是“拿一个指针圆,按它指向的对象的大小移动I次”。因为数组的名称是指向其第一个元素的指针,所以涉及到指针

除此之外,还应初始化循环中使用的整数计数器变量:

for (int i = 0; i < N; i++)
           ^^^^
{
    mtt += mtt_call_func( ( circles + i), N);
                                  ^ // typo
}
for(int i=0;i
circle+i
的意思是“取一个指针圆,按指针指向的对象的大小移动i次”。因为数组的名称是指向其第一个元素的指针,所以涉及到指针

除此之外,还应初始化循环中使用的整数计数器变量:

for (int i = 0; i < N; i++)
           ^^^^
{
    mtt += mtt_call_func( ( circles + i), N);
                                  ^ // typo
}
for(int i=0;i
在堆栈中声明的每个向量实际上都是指向向量的第一个索引0的指针。使用i可以从一个索引移动到另一个索引。因此,
(圆圈+i)
它相当于
&圆圈[i]

&
表示变量的地址。正如在函数调用中一样,您发送一个存储变量地址的指针,因此如果要更改为
圈[i]
,则需要
&
,因为运行函数需要向量圈的i索引地址

有关指针、向量和结构的更多信息,请查看:


它应该涵盖基础知识。

在堆栈中声明的每个向量实际上都是指向向量的第一个索引0的指针。使用i可以从一个索引移动到另一个索引。因此,
(圆圈+i)
它相当于
&圆圈[i]

&
表示变量的地址。正如在函数调用中一样,您发送一个存储变量地址的指针,因此如果要更改为
圈[i]
,则需要
&
,因为运行函数需要向量圈的i索引地址

有关指针、向量和结构的更多信息,请查看:


它应该涵盖你的基础知识。

它编译吗?它应该是
circles+i
它取决于结构的大小。您需要调用
sizeof(circle)
,这样您就可以确切地了解结构的填充大小,因为当您声明一个结构数组时,连续内存将按照声明结构成员的顺序精确对齐。
circle
是一种类型。你的代码应该说是<代码>(圆+ i)< /代码>。你确定这是C++而不是C?@ NeilKirk应该在两种情况下编译,所以技术上是两种情况。编译吗?它应该是
circles+i
它取决于结构的大小。您需要调用
sizeof(circle)
,这样您就可以确切地了解结构的填充大小,因为当您声明一个结构数组时,连续内存将按照声明结构成员的顺序精确对齐。
circle
是一种类型。你的代码应该说是<代码>(圆+ i)< /代码>。你确定这是C++而不是C?@ NeilKirk应该在这两种情况下编译,所以技术上,两者都是。