簡體   English   中英

void* 與 char* 指針算法

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

我的底線:

  • 如果要執行指針運算:使用 (char *)
  • 如果你想獲取指針地址以便稍后將其轉換為另一種類型:使用 (void *)

暫無
暫無

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

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