CONST VOID 型別轉換小記

2021-09-24 18:02:55 字數 3106 閱讀 5465

const void* pconstvoid;

1)首先用const_cast轉換將const void*的const屬性去掉

void* pchar = const_cast

(pconstvoid);

2)用static_cast給void* 變數加上const屬性,並轉換成char*

const char* p = static_cast

(pchar);

void的含義

void即「無型別」,void *則為「無型別指標」,可以指向任何資料型別。

void指標使用規範

①void指標可以指向任意型別的資料,亦即可用任意資料型別的指針對void指標賦值。例如:

int *pint;

void *pvoid;

pvoid = pint; /* 不過不能 pint = pvoid; */

如果要將pvoid賦給其他型別指標,則需要強制型別轉換如:pint = (int *)pvoid;

②在ansi c標準中,不允許對void指標進行算術運算如pvoid++或pvoid+=1等,而在gnu中則允許,因為在預設情況下,gnu認為void *與char *一樣。sizeof( *pvoid )== sizeof( char ).

void的作用

①對函式返回的限定。

②對函式引數的限定。

當函式不需要返回值時,必須使用void限定。例如: void func(int, int);

當函式不允許接受引數時,必須使用void限定。例如: int func(void)。

由於void指標可以指向任意型別的資料,亦即可用任意資料型別的指針對void指標賦值,因此還可以用void指標來作為函式形參,這樣函式就可以接受任意資料型別的指標作為引數。例如:

void * memcpy( void *dest, const void *src, size_t len );

void * memset( void * buffer, int c, size_t num );

指向void 的指標

乙個指向任何物件 型別的指標都可以賦值給型別為void* 的變數,void* 可以賦值給另乙個void* ,兩個void* 可以比較相等與否,而且可以顯式地將void* 轉換到另乙個型別。其它操作都是不安全的,因為編譯器並不知道實際被指的是哪種物件。因此,對void* 做其他任何操作都將引起編譯錯誤。要使用void*,就必須顯式地將經轉換到某個指向特定型別的指標。

例:void test(int *pi)

void *pv = pi; //ok ,從 int* 到 void* 的隱式轉換

*pv ; //錯誤:void* 不能間接引用

pv++; //錯誤:void* 不能增量(不知道被指定型別的大小)

int *pi1 = static_cast(pv); //ok: 顯式轉換回 int*

double * pi2 = pv; //錯誤

double *pi3 = pi; //錯誤

double *pi4 = static_cast(pv); //ok: 不安全

1.一般來說,如果乙個指標被轉換(「強制」,cast)到與被批物件的實際型別不同的指標,使用後乙個指標就是不安全的。 void* 的最重要用途是需要向函式貨傳遞乙個指標,而又不能對物件的型別做任憑假設。還有就是從函式返回乙個無型別的物件。要使用這樣的物件。必須通過顯式的型別轉換。

2,到函式的指標與到成員的指標都不能賦給void*

const char *p; //*p是const,p可變:const 後面緊跟的是char,所以*p是乙個char字元,不可變

const (char *) p;//p是const,*p可變:const 後面緊跟的是(char *)這個整體,所以p是char*型別,不可變。

char* const p; //p是const,*p可變:const 後面緊跟的是p,所以p不可變

const char* const p; //p和*p都是const:第乙個const後面緊跟的是char,所以char型別的字元*p不可變;第二個const後面緊跟的是p,所以p不可變。

char const * p;// *p是const,p可變:const後面緊跟的是*,但是單獨的*不能表明修飾的內容,所以將*p看成乙個整體,所以const修飾的是*p,*p不可變。

(char*) const p;//p是const,*p可變:const緊跟的是p,所以p不可變。

char* const p;// p是const,*p可變:const緊跟的是p,所以p不可變。

char const* const p;// p和*p都是const:第乙個const緊跟的是*,不能表明修飾的內容,將後面整體的(* const p)看成乙個整體,那就說明*p不可變,第二個const後面緊跟的是p,所以p不可變。

--------------------- 

c/c++ 中關於以下三種定義:

const char *ptr;

char const *ptr;

char * const ptr;

現整理三者之間的區別與聯絡。

一、const char *ptr;

定義乙個指向字元常量的指標,這裡,ptr是乙個指向

char* 型別的常量,所以不能用ptr來修改所指向的內容,換句話說,*ptr的值為const,不能修改。但是ptr的宣告並不意味著它指向的值實際上就是乙個常量,而只是意味著對ptr而言,這個值是常量。實驗如下:ptr指向str,而str不是const,可以直接通過str變數來修改str的值,但是確不能通過ptr指標來修改。

gcc編譯報錯資訊:

注釋掉16行ptr[0] = 's';執行正常,執行結果為:

hello world

gello world

另外還可以通過重新賦值給該指標來修改指標指向的值,如上**中取消7、18行的注釋,執行結果為:

hello world

good game!!

二、char const *ptr;

此種寫法和const char *等價,大家可以自行實驗驗證。

三、char

* const ptr;

定義乙個指向字元的指標常數,即const指標,實驗得知,不能修改ptr指標,但是可以修改該指標指向的內容。實驗如下:

gcc報錯資訊:

型別轉換小記

首先我想說的就是string 和tostring 方法 首先呢,tostring 方法是幾乎每個物件都有的方法,但是對於不同的物件這個方法的功能是不一樣的 因為重寫了嘛 而string 方法時乙個全域性的方法,所以他的實現功能就是固定的。就像是mdn上面說的。string全域性物件是乙個用於字串或乙...

C 型別小記

最近在專案中遇到乙個很有意思的問題。簡單重現一下,大概是如下情況。在檔案f1.cpp中定義字串 char str 16 abcdefg 在其他檔案中,比如f2.cpp中使用extern進行一下宣告 extern char str 在對str進行操作時,比如最簡單的 void func 這時候竟然出現...

MySQL欄位型別小記

這裡先總結資料型別。mysql中的資料型別大的方面來分,可以分為 日期和時間 數值,以及字串。下面就分開來進行總結。1.日期和時間資料型別 mysql資料型別 含義date 3位元組,日期,格式 2014 09 18 time 3位元組,時間,格式 08 42 30 datetime 8位元組,日期...