繁体   English   中英

如何定义结构指针和非指针(. 和 ->)?

[英]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 ,计算该地址后第iobject的地址并取消引用结果。

这意味着表达式*pb等价于*(pb + 0) ,它等价于pb[0] 下标操作隐式取消引用pb ,因此表达式pb[i]的类型是struct contact

您使用. 操作数是structunion类型时的运算符, ->操作数是指向structunion类型的指针时的运算符。

由于表达式pb[i]的类型为struct contact ,因此您将使用. 操作员访问namenumber成员:

if ( !strcmp( name, pb[i].name ) ) 
  return pb[i].number;

pb->name[i]pb[i].name不同,并且在您的代码中使用会导致运行时错误。 您没有引用pb数组中的第iname - 相反,您引用的是pb[0]name成员中的第i字符 您将该字符值传递给strcmp ,它需要一个char *类型的地址值。 任何常规字符值不太可能也是有效地址,因此您几乎肯定会在此处看到运行时错误。

为了直接回答这个问题,我建议使用 (*pb).number

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM