[英]Character pointer and array
該代碼段是:
char c[]="gate2011";
char *p=c;
printf("%s",p+p[3]-p[1]);
輸出是:2011
誰能解釋它的來歷?
- - -提前致謝 - - -
依次瀏覽每行:
char c[] = "gate2011";
假設數組c位於內存地址200。
char *p = c;
p現在是指向c的指針。 因此,它指向存儲器地址200。p的實際內容是“ 200”,表示存儲器地址。
printf("%s", p + p[3] - p[1]);
當我們將其視為指針時,p的值為200。 但是,我們也可以將其視為數組。 p [3]獲取字符串中第四個項目的值,即“ e”。 C將字符存儲為其ASCII值。 ASCII值“ e”為101。
接下來,我們得到p [1]的值。 p [1] ==“ a”,其ASCII值為97。將它們替換為函數:
printf("%s", 200 + 101 - 97);
評估結果為:
printf("%s", 204);
在內存地址204,我們有字符串“ 2011”。 因此,程序將打印“ 2011”。
我不確定為什么要這樣做,但是無論如何,這就是正在發生的事情。
p + p[3] - p[1]
在這里,您獲取一個指針的值,並在位置3處添加char的值,然后在位置1處減去char的值。在進行加法和減法之前,將char值隱式轉換為數值。
如果p為位置1000,則將得出總和1000 + 101(ASCII表示e)-97(ASCII表示a)。 因此,結果是指向存儲器中位置1004的指針。 然后, printf中的%s替換以該位置開始並以特殊字符'\\ 0'結尾的字符串。 因此,該字符串實際上被裁剪為“ 2011”(因為101-97 = 4,所以缺少前4個字母)。
如果這仍然沒有道理,我建議您對C中的數組如何工作有個很好的了解。
你期望什么? 為什么不?
p [3] -p [1] ='e'-'a'= 4
p + 4 =“ 2011”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.