[英]void* vs. char* pointer arithmetic
我正在瀏覽我的教科書,我對其中的一些代碼有點困惑。 一方面,他們通過以下方式執行指針運算:
void* bp;
...
bp = (void*)((char*)(bp)+16);
...
但后來,他們做了以下事情:
void* bp;
...
bp = bp+16;
...
我覺得他們應該是兩個不同的東西,但他們把它當作同一件事來對待。 我有這種感覺是因為,例如,如果您要進行數組訪問(例如,對於 integer 數組),您將執行以下操作
int* a = malloc(n*sizeof(int));
...
q = *(a+1);
...
在這種情況下,我不是在訪問 integer 數組中接下來的 4 個字節,而不是下一個字節嗎? 同樣,我覺得如果我有void* a,那么*(a+1)應該是接下來的4個字節……或者不是這樣? 謝謝你。
這是一個失誤。 void *
上的算術未由標准定義,但一些編譯器將其作為擴展提供,與char *
的算術行為相同。 第二個在形式上是無效的 C,但大概是出於(壞)習慣而漏掉了。
接受的答案是一個很好的總結,我想更清楚地說明為什么要使用一個或另一個。 ;)
盡管 (void *) 和 (char *) 都可以等效地轉換為任何其他指針類型,但如果您想遵守標准 C,則只對 (char *) 而不是 (void *) 執行指針運算是合法的.
為什么兩者都用作指針? 大多數與 (void *) 之間的指針轉換都可以在沒有轉換的情況下完成,但是 (char *) 的使用是對舊時代的回憶。
GCC 不會對 (void *) 上的指針算法發出警告,因為它不是旨在符合標准 C 的編譯器,而是針對 GNU C 的編譯器。要符合標准 C,您可以使用以下標志:
gcc -ansi -pedantic -Wall -Wextra -Werror <more args...>
我的底線:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.