什麼在C以下三個指針聲明的區別:位置const關鍵字
void * const myPointer1;
void const *myPointer2;
const void *myPointer3;
,哪一個是用來防止:
myPointer = somethingElse;
什麼在C以下三個指針聲明的區別:位置const關鍵字
void * const myPointer1;
void const *myPointer2;
const void *myPointer3;
,哪一個是用來防止:
myPointer = somethingElse;
從右閱讀規則到左:
void * const myPointer1;
myPointer1是const
指針void
。
void const *myPointer2;
myPointer2是一個指向const
void
。
const void *myPointer3;
myPointer3是一個指向void
const
。
結論:
myPointer1
是你正在尋找的東西 - 這是一個const
指針,所以它的價值不能被修改myPointer2
和myPointer3
是一回事myPointer2
和myPointer3
善良沒有意義 - 引用void*
沒有意義myPointer1
是const
指針void
。mypointer2
和myPointer3
都是指向const void
的指針。myPointer2
與myPointer3
聲明之間的區別只是風格問題。
注意:const void
這裏意味着指出的數據是const
。與void
無關,例如int main(void)
。
「void」類型(或者'const void')的含義是什麼?例如,什麼可以分配到這樣的指針指向的地址('* mypointer2 =?') – SomeWittyUsername 2013-03-01 11:57:06
@icepack:void *是一個「通用指針」,即「指向任何」的指針。你會分配另一個指針的值,比如'mypointer = otherpointer'。不過,您不會將值賦給* dereferenced *指針。 – DevSolar 2013-03-01 12:02:12
@DevSolar是的,我知道這一點。我在想「指向無效」的語義。聽起來這樣的描述在邏輯上是不正確的。這裏的「void」是「nothing」的別名,與「void」的正常含義相反。 – SomeWittyUsername 2013-03-01 12:09:05
在一些地方,你可以把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
尾隨,因爲這是唯一一貫遵守的「規則」。
void * const myPointer1;
=聲明myPointer1爲常量指向voidvoid const *myPointer2;
=聲明myPointer3爲指向void常量const void *myPointer3;
=聲明myPointer3爲指針爲const空隙每當在這種有點懷疑,你可以使用:: cdecl.org
您應該嘗試myPointer1以避免您解釋爲因爲它是const pointer
的情況。
BTW。 http://cdecl.org/不支持「void const * myPointer2;」。這就是爲什麼我登陸這個頁面上,谷歌搜索,以確認我記起來了,這樣2相同的方式3。 – domen 2013-06-20 09:25:36
不要告訴我,你試圖研究它,你還沒有找到任何東西。 – LihO 2013-03-01 11:54:21
不要錯過'const void * const myPointer;':) – elmigranto 2013-03-01 11:56:20
@LihO我做過但沒有發現任何純粹的C(而不是C++或ObjC),並且這是針對簡單的指針類型而沒有在函數中混合的。 – lms 2013-03-01 12:09:29