1. 程式人生 > >C語言 printf 格式輸出指標總結

C語言 printf 格式輸出指標總結

一句話總結:不同格式化輸出控制符對應的是一個儲存單元不同展現形式,該單元的儲存值不變的。

程式碼見真知,程式碼示例如下:

#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);