2013-03-01 66 views
7

什麼在C以下三個指針聲明的區別:位置const關鍵字

void * const myPointer1; 
void const *myPointer2; 
const void *myPointer3; 

,哪一個是用來防止:

myPointer = somethingElse; 
+6

不要告訴我,你試圖研究它,你還沒有找到任何東西。 – LihO 2013-03-01 11:54:21

+0

不要錯過'const void * const myPointer;':) – elmigranto 2013-03-01 11:56:20

+0

@LihO我做過但沒有發現任何純粹的C(而不是C++或ObjC),並且這是針對簡單的指針類型而沒有在函數中混合的。 – lms 2013-03-01 12:09:29

回答

7

從右閱讀規則到左:

void * const myPointer1; 

myPointer1是const指針void

void const *myPointer2; 

myPointer2是一個指向constvoid

const void *myPointer3; 

myPointer3是一個指向voidconst

結論:

  • myPointer1是你正在尋找的東西 - 這是一個const指針,所以它的價值不能被修改
  • myPointer2myPointer3是一回事
  • myPointer2myPointer3善良沒有意義 - 引用void*沒有意義
0
  • myPointer1const指針void
  • mypointer2myPointer3都是指向const void的指針。

myPointer2myPointer3聲明之間的區別只是風格問題。

注意:const void這裏意味着指出的數據是const。與void無關,例如int main(void)

+0

「void」類型(或者'const void')的含義是什麼?例如,什麼可以分配到這樣的指針指向的地址('* mypointer2 =?') – SomeWittyUsername 2013-03-01 11:57:06

+0

@icepack:void *是一個「通用指針」,即「指向任何」的指針。你會分配另一個指針的值,比如'mypointer = otherpointer'。不過,您不會將值賦給* dereferenced *指針。 – DevSolar 2013-03-01 12:02:12

+0

@DevSolar是的,我知道這一點。我在想「指向無效」的語義。聽起來這樣的描述在邏輯上是不正確的。這裏的「void」是「nothing」的別名,與「void」的正常含義相反。 – SomeWittyUsername 2013-03-01 12:09:05

1

在一些地方,你可以把const以任何聲明const面前:

const int * x; // pointer to constant int 

可以總是const無論是聲明爲const後:

int const * x;  // pointer to constant int 
int * const x;  // constant pointer to int 
int const * const x; // constant pointer to constant int 

因此,我個人的建議,總是const尾隨,因爲這是唯一一貫遵守的「規則」。

0
  1. void * const myPointer1; =聲明myPointer1爲常量指向void
  2. void const *myPointer2; =聲明myPointer3爲指向void常量
  3. const void *myPointer3; =聲明myPointer3爲指針爲const空隙

每當在這種有點懷疑,你可以使用:: cdecl.org

您應該嘗試myPointer1以避免您解釋爲因爲它是const pointer的情況。

+0

BTW。 http://cdecl.org/不支持「void const * myPointer2;」。這就是爲什麼我登陸這個頁面上,谷歌搜索,以確認我記起來了,這樣2相同的方式3。 – domen 2013-06-20 09:25:36