2016-09-24 115 views
-3

從C開始工作已經很長時間了,所以現在重新訪問它。C - 基本指針問題

你能幫我解釋'ptr'在下面的代碼中有什麼值嗎?

char str[] = "100"; 
char *ptr; 
ptr = *str; 
printf("\n %p \t %d \n", ptr, ptr); 

輸出顯示:

0X31 49

我知道,指定*海峽到PTR是不正確的,我不過想明白是什麼會實際上意味着。那麼49站在這裏呢?

+0

您的編譯器有義務針對此代碼發佈診斷。如果沒有,請獲得一個新的編譯器。 – EOF

回答

1

C非常容易爲不同種類的變量賦值。這就是爲什麼你沒有得到一個錯誤,即使你應該!
因此,您正在將*strstr指定爲ptrstr是一個字符指針,所以它指向一個字符,在這種情況下,'1'"100"

這一點,那麼,是分配給ptr值,該值'1'或49(至少在一個基於ASCII的系統。在其他系統上,你會得到一個不同的值'1'。比如一個EBCDIC機, '1'應該是241而不是49.)

然後您試圖打印ptr的值,首先作爲指針顯示十六進制指針的數值,然後顯示爲十進制數值。

現在這是一件好事,你不打印*ptr,因爲那樣會出錯!

+0

我確實嘗試了打印* ptr並得到了分段錯誤:)你能解釋一下上面代碼中實際引用的* ptr嗎? – user691197

+1

'* ptr'是ptr指向的內容。但由於它沒有有效的價值,它並沒有指向任何有用的東西。大多數內存管理系統可以識別你的進程是否取消了你不擁有的內存位置,並給你一個分段錯誤(作爲一個故障保護設備,真的,不懲罰你!),但你不應該指望這一點。 –

1

49是您在此處使用%d打印的1的ASCII碼值。由於您正在打印存在於數組的第一個存儲單元中的元素值(ptr = * str = * str [0]),在此處爲1,因此您得到ASCII值爲1,因爲%d。

+0

如何打印1而不是Ascii字符值? – user691197

+1

@ user691197 - 您應該使用%c打印字符值。 –

+0

剛纔看出來。謝謝。 – user691197

1

str不是一個char數組,它只是一個指針,它指向應該數組的第一個內存位置,就像@Am_I_Helpful所說的那樣。通過編寫*str,您可以獲得位於str分的位置的值 - 這意味着您獲取陣列中的第一個值。