[英]%u format Specifier in C
我編譯了這段代碼,它給出了'&x'值的3倍。 也就是說,如果&x = 2000,它將打印2036次三遍。 我想知道這種行為的原因,假設整數需要4個字節的內存。
#include <stdio.h>
int main(void) {
// your code goes here
int x[4][3] = {0};
printf("%u %u %u", x+3, *(x+3), *(x+2)+3);
return 0;
}
該代碼的輸出是什么
通過使用轉換說明符為unsigned
轉換指針值來顯示指針值,代碼引發未定義的行為,可能會發生任何事情。
要打印指針值,請使用轉換說明符p
。
數組的地址及其第一個元素的地址相同。 但是,指向它們的指針的類型不同。
x
以及x + 3
的類型為int (*)[3]
,它指向三個int
的數組。 假設int
的大小為4
,則三個int
的數組的大小為12
。
將x
(指向int (*)[3]
的指針)增加三個元素,其結果是x
指向的地址超出3 * 12
個字節。 這稱為指針算術。
因此,您正在濫用格式說明符並調用未定義的行為。 在那時,發生的事情是武斷且無趣的。
如果要打印指針,請使用%p
說明符。
x是指向指針數組的指針。 指針數組具有4個元素。 這四個元素中的每一個都指向3個整數。
因此,如果x = 2000,
x [0] = 2000,x [1] = 2012,x [2] = 2024,x [3] = 2036。
因此,
x + 3 = 2036(因為x是數組指針,並且每次增加12。)
*(x + 3)= x [3] = 2036。
*(x + 2)+3 = x [2] + 3 = 2024 + 3 * 4 = 2036。
因此,輸出將是三個相同的數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.