[英]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
(十進制)值為14
( 1*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.