說我有以下問題:關於指針和數組和類型和鑄造
main(void) {
int * p;
int nums [3] = {1,5,9};
char c [3] = {'s','t','u'};
p = nums [2];
*p = (int) *c;
}
什麼是最後一行是什麼意思?
說我有以下問題:關於指針和數組和類型和鑄造
main(void) {
int * p;
int nums [3] = {1,5,9};
char c [3] = {'s','t','u'};
p = nums [2];
*p = (int) *c;
}
什麼是最後一行是什麼意思?
*c
→Decay c
to pointer-to-first-element,並訪問指向的值。與c[0]
相同。
(int) *c
→將該值轉換爲int
。
*p = (int) *c
→將其分配給p
指向的內容。
讓我們來分析一下:*p = (int) *c;
c
是一個字符數組。
*c
是char數組的第一個元素,因爲c[0]
= *(c+0)
= *(c)
= *c
(int) *c
連鑄char數組c
的第一個元素爲整數。這是必需的,因爲...
*p = (int) *c
您將一個整數鑄造字符分配給指針p
的內容。
此代碼不起作用,否則會導致問題。
該行; p = nums [2];
將指針p的值設置爲值9.這不可能是指針的合法值。如果是,則存儲位置9將被設置爲115,這是's'的整數值。
我的意思是設置p =#[2] –
這段代碼有很多問題,我們先來解決它們。
首先,main(void)
是不符合的代碼。您需要將其更改爲int main(void).
其次,p = nums [2];
是錯誤的。 p
的類型爲int *
,而nums[2]
的類型爲int
。您不得將int
指定爲int *
,並期望取得豐碩的成果。也許你想寫的是p = &nums[2];
。沒有這個修改,進一步將調用undefined behavior,因爲您將嘗試訪問內存位置無效的到您的程序。
然後,來到你的問題,
*p = (int) *c;
它基本上取消引用c
注:來獲取值,然後將其轉換爲int
類型和存儲到由p
指向的內存位置。但是,在C
中,此投射不是必需的。以上聲明相當於
*p = *c;
無論如何。
注:陣列名稱衰減到的指針數組,即,在該代碼的第一個元素,採用c
相同&c[0]
,大致。
但是當你說* c ...它是一個數組。那麼它總是指向第一個索引? –
So * c表示指向數組第一個索引的內存位置的指針? –
數組是數組,而不是指針。數組不指向任何地方。但是,一個數組可以衰減爲指向數組中第一個元素的指針,就像'*'解除引用運算符應用於數組名時發生的情況一樣。因此'* c'的值是數組的第一個元素,並且與寫入'c [0]'相同。 – emlai