簡體   English   中英

將c變量作為數組訪問

[英]Access c variable as an array

我有點呆滯,搜索正確的單詞無法使我獲得正確的答案。 更糟糕的是,我已經這樣做了,但是我自己的代碼示例在源代碼中的某個位置丟失了。

#include <stdio.h>

int main()
{
    short x = 0xABCD;
    char y[2] = { 0xAB, 0xCD };
    printf("%x %x\n", y[0], y[1]);
    printf("%x %x\n", (char *)&x[0], (char *)&x[1]);
}

基本上,我只需要通過類型轉換就可以通過指針算術通過數組訪問各個變量字節,而無需進行任何計算。

在演員表上加上括號:

printf("%x %x\n", ((char *)&x)[0], ((char *)&x)[1]);

請注意,字節序可能會更改您的預期結果。

將來,請使用-Wall進行編譯,以查看警告或錯誤。

C99在某種程度上支持它。 通過稱為聯合的類型修剪的過程。

union {
  short s;
  char c[2];
} pun;

pun.s = 0xABCD;
pun.c[0] // reinterprets the representation of pun.s as char[2].
         // And accesses the first byte.

指針轉換(只要是char* ,以避免嚴格的別名沖突)也是可以的。

short x = 0xABCD;
char *c = (char*)&x;

如果只想獲取 ,則可以將源變量的地址存儲在char *然后遞增和取消引用char指針以打印每個字節的值。

引用C11 ,第§6.3.2.3章

[....]將指向對象的指針轉換為指向字符類型的指針時,結果指向該對象的最低尋址字節。 結果的連續遞增(直到對象的大小)會產生指向對象剩余字節的指針。

像這樣的東西( 考慮偽代碼,未經測試

#include  <stdio.h>

int main(void)
{
    int src = 0x12345678;
    char * t = &src;

    for (int i = 0; i < sizeof(src); i++)
        printf("%x\t", t[i]);

    return 0;
}

應該這樣做。


也就是說,為詳細說明已接受的答案, 為什么部分:

根據運算符優先級表 ,數組索引運算符的優先級高於類型轉換,因此,除非在表達式中明確強加,

  (char *)&x[0]

x的類型未按預期更改。 因此,要強制使用類型轉換的有意義的用法,我們需要將其括在括號中。

暫無
暫無

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

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