簡體   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