C語言 printf 格式輸出指標總結
阿新 • • 發佈:2019-01-25
一句話總結:不同格式化輸出控制符對應的是一個儲存單元不同的展現形式,該單元的儲存值是不變的。
程式碼見真知,程式碼示例如下:
#include <stdio.h> #include <string.h> void main(){ int i=10; printf("i value is: %d\n",&i); //1.1 輸出結果: i value is: 1706007260 printf("i addr is: %p\n",&i); //1.2 輸出結果:i addr is: 0x7fff65af9adc int *pp=0; pp=&i; printf("pp value: %d\n",pp); //2.1 輸出結果:pp value: 1706007260 printf("pp addr: %p\n",pp); //2.2 輸出結果:pp addr: 0x7fff65af9adc printf("pp x value: %x\n",*pp); //2.3 輸出結果:pp x value: 0x7fff65af9adc }
1. 先分析1.1,2.1以及1.2, 2.2
結論:
%d 將所給儲存單元以十進位制有符號型形式輸出。
%p 將所給儲存單元以十六進位制輸出指標變數對應的地址值。
%x 將所給儲存單元以十六進位制形式輸出。
注: 其實還可以試試以%x格式打印出指標變數對應的地址值
如果在64位系統下編譯執行的話,會發現相對於%p輸出結果,少了 7fff 也就是說,結果為ox
pp addr: 65af9adc
具體原因我還不知道,我這裡測試的環境是64位fedoral。所以我估計是因為在當前環境中,以7fff為字首的地址都是屬於記憶體區域中的NORMAL,所以以%x形式輸出時省略了其字首,同時在64位系統中,地址的長度為48位。
4. 關於指標初始化,不得不說
這裡將指標變數pp初始化位0,只是將pp變數初始化為0,也就是對應的地址為(nil)。如果是10的話,是oxa。這裡如果直接去引用pp所對應的int值的話,是會報錯的。再思考片刻,我想指標初始化的含義你已經明白了。
5. 要注意區分float和double型別的輸入/出格式控制符:float(%f),double(%lf)!
一般情況下是不會有太大差別,但是對於scanf函式,如果要輸入double型別資料,則必須使用%lf控制符,形如,scanf("%lf", &dnum);