[英]How do I define struct pointers and non-pointers (. and ->)?
如果我的结构看起来像:
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
.
.
.
如果我们仔细看看 function 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
。name
指向的数组中的第i
个事物。 即它返回第一个联系人姓名中的第i
个字符。
pb[i].name
告诉计算机:
pb
中的值(这是一个地址)i
个结构name
。 即它返回第i
个联系人姓名的地址。
pb->number[i]
没有意义,因为number
不是数组。 您从第一个联系人的号码中要求第i
个东西,但该号码不是数组或指向一个的指针。
pb->name[i]
也是错误的,但它是有道理的。 你在向计算机索要一些你不想要的东西,但至少它是可能的,所以无论如何计算机都会这样做。
数组下标操作a[i]
完全等同于*(a + i)
- 给定起始地址a
,计算该地址后第i
个object的地址并取消引用结果。
这意味着表达式*pb
等价于*(pb + 0)
,它等价于pb[0]
。 下标操作隐式取消引用pb
,因此表达式pb[i]
的类型是struct contact
。
您使用.
操作数是struct
或union
类型时的运算符, ->
操作数是指向struct
或union
类型的指针时的运算符。
由于表达式pb[i]
的类型为struct contact
,因此您将使用.
操作员访问name
和number
成员:
if ( !strcmp( name, pb[i].name ) )
return pb[i].number;
pb->name[i]
与pb[i].name
不同,并且在您的代码中使用会导致运行时错误。 您没有引用pb
数组中的第i
个name
- 相反,您引用的是pb[0]
的name
成员中的第i
个字符。 您将该字符值传递给strcmp
,它需要一个char *
类型的地址值。 任何常规字符值不太可能也是有效地址,因此您几乎肯定会在此处看到运行时错误。
为了直接回答这个问题,我建议使用 (*pb).number
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.