簡體   English   中英

基本程序,有趣的輸出? 說明

[英]Basic program, Interesting output? Explanation

我正在學習指針,我正在從教程中運行這個程序,它提供了一些有趣的輸出。

#include <stdio.h>

int main () {

    int var = 20; /*actual variable declaration */
    int *ip; /*pointer variable declaration*/

    ip = &var; /*store addres of var in ip variable*/

    printf("Address of var variable: %x\n", &var);

    /*address stored in ip variable*/
    printf("Address of stored in ip variable: %x\n", ip);
    /*access the value using pointer */
    printf("value of *ip variable: %x\n", *ip);

    return 0;

}

根據我的理解,該網站說我的輸出應該是兩個匹配的內存位置,而值為20的“* * ip變量”部分。 我對內存位置沒有任何問題,它們都像人們想象的一樣,最后一部分,它告訴我* ip變量的值是14?

Address of var variable: 6d73b8cc
Address of stored in ip variable: 6d73b8cc
value of *ip variable: 14

這里發生了什么? 用gcc編譯,它給出一個關於格式%x的警告,期望一個無符號整數,但參數2的類型為....

MorePointers.c:10:9: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
  printf("Address of var variable: %x\n", &var);
         ^
MorePointers.c:13:9: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
  printf("Address of stored in ip variable: %x\n", ip);

請糾正我,如果我錯了,但可能是由於格式,當期望無符號整數時可能導致數字不是20? 作為無符號整數的值在0到65,535或0到4,294,967,295之間,而整數在-32,768到32,767或-2,147,483,648到2,147,483,647之間?

發生的事情是您將整數值20打印為十六進制值,正確顯示為14 我懷疑你期待20小數。 :)

一些修復: -

printf("Address of var variable: %x\n", &var);

這是不正確的,應該將指針打印為指針值

printf("Address of var variable: %p\n", &var); /* << ensure pointer value */

當你調用printf ,它會將固定文本和參數按順序混合......

printf( "hello %d world %d today %d\n", 1,2,3 );  

今天打印你好1世界2 3

顯示參數的方式基於格式說明符。

%s /* displays as a string */
%d /* displays as an integer in normal decimal */
%x /* displays an integer in hexa-decimal. */
%f /* displays as a floating point */
%p /* displays a pointer address */

Decimal goes      0,1,2,..,8,9,10,11,...,14,15,16,17,...,20
Hexadecimal goes  0,1,2,..,8,9, A, B,..., E, F,10,11,...,14

您正在打印var*ip的十六進制值,即0x14

使用%d作為十進制值。

前兩個printf()語句具有未定義的行為,因為%x要求相應的參數為unsigned類型,而不是指針。 因此警告。 如果要打印指針的值(並將指針轉換為(void *)以使用它),請查找%p格式。

%x以十六進制表示打印,基數為16.十六進制的20 (十進制)值為141*16 + 4 )。 嚴格來說,您應該將int轉換為unsigned以使用%x

printf()的打印地址應該用'%p'而不是'%x'來完成。

如果您編譯時啟用了所有警告(對於gcc,至少使用: -Wall -Wextra -pedantic ),編譯器會告訴您,對於第10行和第13行:

warning: format: '%x' expects argument of type 'unsigned int', but argument two has type 'int*' [-Wformat=]`   

對printf()的最后一次調用是傳遞一種'int',但'%x'期望一個unsigned int。

建議將'ip'和'var'聲明為unsigned int而不是int

或將最后一個printf()更改為:

printf("value of *ip variable: %d\n", *ip);

你可以閱讀。了解printf()的格式說明符:

<http://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output>

或者閱讀printf手冊頁

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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