将结构数组传递给函数

cde*_*169 1 c struct pointers function

我已经学习了大约2个月的C,仍然是新手:(

我知道这个网站还有其他类似的问题.我读过它们,但仍然无法理解,所以我在这里.以下是我的代码:

//naming my structure as ball
typedef struct ball_room {
int enter;
int exit;
} ball;

//I've omitted some irrelevant details for brevity
    int i, n, max;
    scanf("%d", &n);
    ball person[n];
    .../*assign values to ball.enter and ball.exit with user input*/
    max = 1;
    for (i = 0; i < n; i++)
        if (ball_room(person, person[i].enter, n) > max)
            max = ball_room(person, person[i].enter, n);
    printf("%d\n", max);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

以下是接收数组的函数:

//This function returns the number of people in the ballroom
//when b[j](person[j] in "main") enters
int ball_room(ball *b, int i, int n)
{
    int people = 0, j;
    for (j = 0; j < n; j++)
        if (b[j].enter <= i && b[j].exit > i)
            people++;
    return people;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么它b[j].enter不是b[j]->enter我的编译器不接受的呢?在我有限的经验中,当操纵结构本身(对象)时,我.用来进入结构内部,当它是指针(地址)时,我使用->(希望这是正确的.)

在这种情况下,我将数组传递给函数using ball *b,它代表地址person[0],所以我可以访问整个数组.但不ball *b应该以指针的形式,因此我应该用它->来访问它的内容?它只是我传递给函数的地址.

这是我第一次用一系列结构做一些事情,请帮我清楚一点,谢谢!

ste*_*toc 5

你使用.而不是->因为这个参数声明:

int ball_room(ball *b, int i, int n)

b应该是指向具有类型的数据的指针ball,因此您可以通过各种方式访问​​它:

  1. 数组方式:例如b[5].somefield = 15- 你在这里使用点,因为如果b是类型ball *,它意味着b是指针或它是具有类型的对象数组b,如果它是具有类型的对象数组b(这是你的情况),你.用来访问对象的字段
  2. 指针方式:例如(b+5)->somefield = 15-它将会做同样的事情,上面的代码,但你会访问数据pointer的方式

  • 更确切地说,它始终是指向单个对象的指针.作为数组的约定,这个单个对象将是数组的第一个元素. (2认同)

Eri*_*hil 5

给定ball *b,b[j]是来自b指向的元素的元素.因此b[j]不是指针; 它是一个结构.由于它是一个结构,因此您可以使用它.来引用其中的成员.

b[j]C标准中的定义是它*((b)+(j)).所以它需要指针b,移动j元素超出它,然后应用*.

既然*已经应用了b[j],你就不需要->..