簡體   English   中英

printf函數如何與整數一起使用?

[英]How the printf function works with integer?

我有以下代碼

int main()
{
    int arr[3] = {2, 3};
    char *p;
    p = arr;
    p = (char *)((int*)(p));
    printf("%d, ", *p);
    p++;
    p = (int*)(p+1);
    printf("%d", *p);
    return 0;
}

o / p-2,0

但是我想知道在第二個printf中是如何打印0的,我知道關於little-endian所有信息,例如在4 byte integer內存中,這些元素的存儲方式如下

00000010 00000000 0000000 00000000 00000011 00000000 00000000 00000000

因此,在第一個printf期間,我們得到2作為答案,但是在第二個printf期間,指針位於second byte ,該second byte為0,但現在它是一個整數指針,但是它如何打印0,因為它必須檢查最多4個字節的內存,然后它必須將整個數據打印到4個字節。 我認為它將是3,因為它將最多打印4字節。

我想要的是如何通過printf打印整數數據,任何人都可以告訴我。

指針p的類型不會隨以下兩個之一改變: p = (char *)((int*)(p)); p = (int*)(p+1);

它仍然是指向char的指針。

強制轉換僅可更改表達式中的值(或類型)。 它適用於從變量提取的值的副本,但不修改這些變量。 表達式結束后,類型轉換將與其關聯的值副本消失。

例:

signed char c = -1;
int i;
i = (unsigned char)c;

在這里, c的值-1被轉換/轉換為unsigned char類型。 如果chars是8位,則(unsigned char)-1的結果為255,並且該值的類型為unsigned char ,然后將其轉換為int並分配給i

c在上述過程中不會發生任何變化。

范例2:

unsigned u = 0x55AA;
unsigned* pu = &u;
unsigned char* pc = (unsigned char*)pu;

在這里pu被轉換/轉換為指向unsigned char類型指針。 該轉換不會修改變量pu ,而只會更改其值的副本。 在這里,它只是更改指針變量中包含的副本類型,而不是實際地址。 然后將此地址副本分配給pc 進行強制轉換是為了避免編譯器警告/錯誤,因為編譯器擁有“懷疑”這里發生的一切以及是否可能發生編程錯誤的所有權利。

現在, pupc指向同一位置,即變量u的開頭。 但是它們具有不同的類型,一個指向一個unsigned char ,另一個指向一個unsigned int

因此,如果取消引用pupc ,則將獲得不同的值,並且這些值也將具有不同的類型。

同樣,如果您對兩個指針執行指針算術,例如,對每個指針加1,則它們將前進以指向內存中的不同位置。 pu+1將指向位置結束之后upc+1將指向第二個unsigned char從一開始u

您開始看到它了嗎?

我認為您的基本問題實際上是代碼中的錯誤,您說“在第二個printf期間指針位於第二個字節”,但這不是事實。 首先用p ++遞增指針(現在它指向第二個字節),然后用p =(int *)(P + 1)遞增AGAIN,使p指向THIRD字節。

在我看來,就我所知刪除所有類型強制轉換完全不會改變此代碼的功能,您似乎並不真正了解類型轉換的工作原理。

我認為對於2,它存儲為'00000010 00000000 0000000 00000000'。 由於p是一個char指針,因此當p增加時,意味着p向前移動2個字節。 對於代碼'p =(int *)(p + 1),當p增加1時,p是char指針。 因此,在p + 1之后,p指向“ 0000000 00000000”。 因此,第二個printf將打印0。

暫無
暫無

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

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