#include<stdio.h>
int main()
{
char *p;
p="%d\n";
p++;
p++;
printf(p-2, 400);
return 0;
}
當我在代碼上面運行時,輸出400.但是爲什麼400?以下C程序的輸出是什麼
#include<stdio.h>
int main()
{
char *p;
p="%d\n";
p++;
p++;
printf(p-2, 400);
return 0;
}
當我在代碼上面運行時,輸出400.但是爲什麼400?以下C程序的輸出是什麼
printf()
的第一個參數是格式字符串。變量p
是一個指向字符數組的指針,這也是字符串表示的方式。
當p被分配一個字符串"%d\n"
它說格式化一個整數來打印它的值,然後打印回車符。
由於p
是字符指針p++
表示將指針向前移動1個字符。這會執行兩次以將p
向前移動2個字符,因此它指向回車符的開頭。 p-2
說做指針數學給char*
2個字符在p
點前面。
這是回車字符串%d
的開頭。這成爲格式字符串,並且第二參數400替代%d
並打印其自身,然後回車。
首先爲p
分配格式化字符串。然後它減少兩倍。最後,它的值減2傳遞給帶有附加參數400的printf。
從最新值p
中減去2將其移回原始格式化字符串。因此,printf輸出值爲400.
謝謝@Zbynek。我明白了。 –
您聲明瞭一個指向字符串的指針,併爲其指定值"%d\n"
。這個指針在內存中保存一個地址。
例如,讓我們說的好聽點,以解決6時加兩到它(這你不應該做你,你總是知道你的指針都指向)你地址更改爲8
現在當你做printf
你用當前的地址p
指向(8)減去2代替它,它是6.
你還會期望得到什麼,爲什麼? –
實際上我並沒有更深入地意識到printf()函數的語法。所以我不明白我的代碼中發生了什麼。 –