首页 > 解决方案 > 当结构来自“结构数组”时在函数中传递结构

问题描述

在“ C Programming: A Modern Approach ”一书中,向读者提供了以下准代码:

struct part {
  int number;
  char name[NAME_LEN+1];
  int on_hand;
} part1;

void print_part (struct part p)
{
  ...
}

struct part inventory[100];

print_part(inventory[i]);

inventory[i].number=883;

inventory[i].name[0] = `\0`

因此,总而言之,作者创建了一个名为的数据类型,创建了一个以数据类型变量为参数的struct part函数,创建了一个存储 100 种不同类型结构的数组,然后对上述函数进行了以下调用: , where可以取 0 到 99 之间的任意值。print_partpstruct partinventorystruct partprint_part(inventory[i])i


在上面的函数调用中,是inventory[i]作为指针起作用的吗?起初我认为肯定不是(因为print_part的原型语句指定函数的参数是一个结构变量......不是指向结构的指针)。

然而,inventory[i].number=883and的后续用法inventory[i].name[0]='\0'让我重新考虑,也许它确实起到了指针的作用。

在 的情况下inventory[i].name[0],似乎inventory[i]正在建立一个基地址,并且从该基地址开始,数据类型的第二个字段有一个偏移量。这让我觉得非常“指针式”。任何澄清将不胜感激!struct partname

标签: cstruct

解决方案


在上面的函数调用中,inventory[i] 是作为指针起作用的吗?

不,类型inventory[i]struct part。它通过 value传递给函数,就像任何其他函数参数一样。*

起初我认为肯定不是(因为 print_part 的原型语句指定函数的参数是一个结构变量……而不是指向结构的指针)。

你这样想是对的。

然而,inventory[i].number=883and 的后续用法inventory[i].name[0]='\0'让我重新考虑,也许它确实起到了指针的作用。

我没有看到那里的联系。这些.表达式中的 是用于访问结构成员的运算符。它的左操作数必须是一个结构,而不是一个指针。如果inventory[i]是指针,那么访问它所指向的结构成员的惯用方式是使用->运算符,形式为array_of_pointers[i]->member = value.

在 的情况下inventory[i].name[0],似乎inventory[i]正在建立一个基地址,并且从该基地址开始,结构部分数据类型的第二个字段 name 有一个偏移量。这让我觉得非常“指针式”。

大多数对象都有关联的存储,它具有适当指针类型的特征地址。当您访问一个对象时,您可以将其视为访问该对象地址处的内存。当然,您可以称其为“pointeresque”,但这不会使指定对象的表达式成为 C 意义上的指针。指针引入了额外的间接级别,而inventory[i].


*也许有人在说“不是数组!” 马上。没错,数组不是按值传递给函数的,因为它们根本没有传递给函数。在几乎所有数组类型的子表达式出现在表达式中的情况下,它会自动被 a 替换为指向第一个数组元素的指针。函数调用的参数列表不在例外之列。因此,甚至无法表达将数组传递给函数。


推荐阅读