問題:
我可以有兩個不同型別(uint32_t *和char *)的指標指向同一個地址嗎?
這就是我想要這個的原因:
我想將UTF-8轉換為UTF-32,反之亦然C。
比方說,我有一個型別的變數,uint32_t其中包含一個 UTF-32 編碼的 unicode 字符。而且我已經知道它在以 UTF-8 編碼時需要 4 個位元組。它的二進制表示是這樣的:
00000000000aaabbbbbbccccccdddddd
的a,b,c和d是4個不同的范圍,其中每一個位元可以是0或1.聰明按位&,|并且<<操作,以便在端部有這種新的分布I可以重新排列這些位:
00000aaa00bbbbbb00cccccc00dddddd
然后我可以翻轉一些位(|再次使用),以獲得這個
11110aaa10bbbbbb10cccccc10dddddd
當我將其拆分為char陣列中的4 個后續變數時,我有:
11110aaa 10bbbbbb 10cccccc 10dddddd
這正是同一 unicode 字符的 UTF-8 編碼。
因此,記憶體中相同的 4 位元組應該是一個單一uint32_t變數,同時是一個包含 4 個char變數的陣列:
所以,我想要這個:
uint32_t *utf32;
char utf8[4];
*utf32是一個指向單個 4 位元組長uint32_t變數的指標。utf8是一個指向 4 個char元素陣列的指標,每個元素長 1 個位元組。
我希望兩個指標都指向同一個地址。所以我可以將一個 utf32 編碼的字符寫入變數中utf32,將其轉換到位,然后從陣列中讀取結果utf32。這可能嗎?如果是這樣:我該怎么做?
(我在上個千年用COBOL編碼時,經常使用這種技術,因為在COBOL中很容易用許多不同的定義多載記憶體中的同一區域。但我不知道如何在C中實作。)
我發現了很多關于指向同一地址的 2 個指標的問題,但在這些問題中,指標的型別始終相同。還有一些其他問題是關于如果用某種型別定義的指標指向用另一種型別定義的地址,為什么會出現錯誤。但是我沒有發現關于共享相同地址的兩個不同型別的指標的任何資訊。
uj5u.com熱心網友回復:
我可以有兩個不同型別的指標(uint32_t * 和 char *)指向同一個地址嗎?
是的你可以。
union U {
uint32_t ui32;
char c[4];
};
union U u;
u.ui32 = ...
uint32_t *pi = &u.ui32;
char *cp = u.c;
assert(pi == cp);
有一些 C 語言規則,如果你使用結果char*來做一些事情而不是將資料復制進去或復制出來,你會違反這些規則,但是“指向同一地址的兩種不同的指標型別”本身并不是問題。
uj5u.com熱心網友回復:
是的,兩個不同型別的指標可以指向同一個地址。
假設您記憶中的某個地方是這個 utf32 并且您知道它在哪里,所以我將其稱為address.
因此,如果您想將這 4 個位元組視為一個,uint32您可以這樣做:
uint32_t* utf32 = address;
并且您可以輕松地將 is 視為字符陣列:
char* utf8 = address;
如果您想訪問一個字符,您只需執行以下操作:
utf8[index]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/390815.html
下一篇:指標算術等價
