arrays - 如何定义结构指针和非指针(. 和 ->)?
问题描述
如果我的结构看起来像:
struct contact {
char* name;
int number;
};
我正在编写的其中一个函数如下所示:
int find(struct contact* pb, int len, char* name)
{
for (int i = 0; i < len; i++)
if (strcmp(name, pb->name[i]) == 0) // pb[i].name is OK!
return pb[i].number; // pb->number[i] ? - but number is not a pointer
.
.
.
如果我们仔细看一下这个函数find
,我们可以看到如下:pb->name[i]
就像写法pb[i].name
一样。但是呢:pb[i].number
?我知道这number
不是一个指针,所以我怎么能把它写成:pb[i].number
?它不能是:pb->number[i]
,对吧?
解决方案
pb->name[i]
不一样。_pb[i].name
pb->name[i]
告诉计算机:
- 查看存储在变量中的值
pb
(这是一个地址) - 查看该地址指向的结构 (
->
) - 看看
name
那个结构中的。 - 查看数组中指向的
i
-th 东西。name
即它返回i
第一个联系人姓名中的-th 字符。
pb[i].name
告诉计算机:
- 查看存储在变量中的值
pb
(这是一个地址) - 查看
i
该地址指向的数组中的第 -th 结构 - 看看
name
那个结构中的。
即它返回i
第-个联系人姓名的地址。
pb->number[i]
没有意义,因为number
不是数组。您i
从第一个联系人的号码中要求 -th 东西,但该号码不是数组或指向一个的指针。
pb->name[i]
也是错误的,但这是有道理的。你在向计算机索要一些你不想要的东西,但至少它是可能的,所以无论如何计算机都会这样做。
推荐阅读
- angular - Ionic 5 变量变量插值不起作用
- c - Leetcode twoSum问题使用C“控制到达非空函数的结尾”
- java - Java 打印 Greeter@33c7353a 而不是名字
- javascript - 使用 multer 中间件表达动态路由
- python - 我将如何隐藏使用 CURVE3 或 CURVE4 构建的 matplotlib 路径上的控制点
- c# - DateTime 和 TimeZoneInfo 类如何处理夏令时?
- c# - nuget 包 .pp 不转换为 .cs 文件
- python - TypeError: __init__() 缺少 1 个必需的位置参数:'post_location' 一直指我远离 __init__
- flutter - Flutter Container 变换(动画包)
- java - 单击按钮而不是自己启动计时器(javax.swing)