簡體   English   中英

C中的%u格式說明符

[英]%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.

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