[英]Understanding null pointers in C
所以想象我有這個
main() {
int a = 5;
int *p;
printf("p: %d", (void*)p);
}
為什么我必須在 printf 語句中強制轉換 *p? 但如果我這樣做...
p = &a;
printf("p: %d", *p);
這次我不用投了?
所以我的問題是我是否需要每次都將 void 轉換為空指針?
在第一個示例中,您正在打印指針本身的值,但使用了錯誤的格式說明符。
printf("p: %d", (void*)p);
應該
printf("p: %p", (void*)p);
原因是, %d
指定的int
可能與指針的大小不同。 強制轉換的原因是因為%p
打印了void*
指針的值。 但請注意:在您的示例中int *p
未初始化,因此打印其值是無用的。
在第二個示例中,您打印的是指針指向的值,不需要強制轉換,因為類型是一致的。
printf("p: %d", *p);
要打印出指針值( NULL
或其他),您必須使用%p
轉換說明符,它期望其對應的參數具有類型void *
:
printf("p = %p\n", (void *) p );
這可能是 C 中唯一一次您需要將指針值顯式轉換為void *
(如果它還不是void *
,無論如何)。 原因是printf
讀取其參數的方式、可變參數函數中的默認類型提升以及我尚未弄清楚如何解釋的其他一些事情的組合。
請注意,您正在轉換p
的值(指針),而不是它指向的東西。
在第二個打印語句中,
printf("*p = %d\n", *p );
你正在打印p
指向的東西的值,它是一個整數。 表達式*p
類型為int
,這是%d
轉換說明符所期望的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.