簡體   English   中英

字符指針和數組

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM