[英]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.