c - 当结构来自“结构数组”时在函数中传递结构
问题描述
在“ 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_part
p
struct part
inventory
struct part
print_part(inventory[i])
i
在上面的函数调用中,是inventory[i]
作为指针起作用的吗?起初我认为肯定不是(因为print_part
的原型语句指定函数的参数是一个结构变量......不是指向结构的指针)。
然而,inventory[i].number=883
and的后续用法inventory[i].name[0]='\0'
让我重新考虑,也许它确实起到了指针的作用。
在 的情况下inventory[i].name[0]
,似乎inventory[i]
正在建立一个基地址,并且从该基地址开始,数据类型的第二个字段有一个偏移量。这让我觉得非常“指针式”。任何澄清将不胜感激!struct part
name
解决方案
在上面的函数调用中,inventory[i] 是作为指针起作用的吗?
不,类型inventory[i]
是struct part
。它通过 value传递给函数,就像任何其他函数参数一样。*
起初我认为肯定不是(因为 print_part 的原型语句指定函数的参数是一个结构变量……而不是指向结构的指针)。
你这样想是对的。
然而,
inventory[i].number=883
and 的后续用法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 替换为指向第一个数组元素的指针。函数调用的参数列表不在例外之列。因此,甚至无法表达将数组传递给函数。
推荐阅读
- python - 有什么方法可以在不改变图像纵横比的情况下使用 python pptx 包在 pptx 中拟合图像
- python - 连接到远程计算机上的 Jupyter Notebook 时出现问题
- javascript - 尝试使用 Escape 键将输入的值设置为原始值
- powershell - 我的 powershell 脚本没有停止我正在打开的进程
- flutter - 在列中插入两个 TextField
- java - 如何让通知出现在准确的时间。例如在 12:00、13:00、14:00、15:00 等
- android - 带有 Flutter 框架的文件观察器
- .net - 发布 dotnet 应用程序时如何选择特定的 dotnet core sdk
- firebase - Firestore 安全规则读取 get() 文档的计数
- java - 将短路运算符与其他运算符混合