2014-10-07 71 views
-1

指向void(void*)的指針與任何其他指針類型兼容,並且可以容納任何其他指針類型。對於指向const void的指針也是如此(const void*)。使用const void *而不是void *,對於任何類型

時間:

6.3.2.3,P2:對於任何限定符Q,一個指針指向一個非Q限定的類型可以被轉換爲一個指向 類型的q合格版本;存儲在原始值和轉換後的指針 中的值應相等。

因爲我允許這樣的:

int n = 0 ; 
void* p = &n ; 

我應該也被允許這樣的:

int n = 0 ; 
const void* p = &n ; 

這使我想起我的最後一點,這是這一切也應舉行用於複合文字。

void SomeFunc(const void* p) { printf("%p",p) } ; 

SomeFunc(&(int){ 12345 }) ; 

應由C標準定義(並允許)?

回答

2

我會直接承認我很少在C語言中找到對複合文字的需求,但是您的語法絕對是有根據的。如果我正確理解你的問題,那麼試圖確定前面提到的應用於複合文字的地址運算符是否導致const vs非const指針。

它是非const的,除非化合物本身是const限定的。我沒有C99標準得心應手,但我可以強加於我們的最佳例子是在啓發性的例子:

C11標準§6.5.2.5P11

只讀複合文字再加上從複合文字的存儲資格的描述

(const float []){1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6} 

可以通過像構造來指定點

C11標準§6.5.2.5P5

的化合物的值字面是,由初始化列表初始化未命名的對象的。如果複合文字出現在函數主體之外,則該對象具有靜態存儲持續時間;否則,它具有與封閉塊關聯的自動存儲持續時間。

所以存儲也是存在的(即它不在某處的只讀存儲器中)。除非const限定,否則複合文字實際上是非常量(如果複合文字數組或結構實際上可能具有其自己的const限定條件,則其中的數據/元素爲非const)。

Type *要麼void*const void*翻譯的機制是有希望明顯,但它是值得您的樣品的一些扭轉指出:

void SomeFunc(void* p) { printf("%p\n",p); } ; 
void SomeFuncConst(const void* p) { printf("%p\n",p); } ; 

int main() 
{ 
    SomeFunc(&(int){ 12345 }) ;  // OK. int* to void* 
    SomeFuncConst(&(int){ 12345 }) ; // OK. int* to const void* 
    SomeFuncConst &(const int){12345}); // OK. const int* to const void* 
    SomeFunc(&(const int){ 12345 }) ; // ERROR. const int* not allowed as void* 
} 

鑑於所有這一切,這是完全可行的,我誤解你的問題,並且如果這樣的話,請善意澄清我達到的刪除鏈接。

+0

是的,我錯過了你有兩個功能。 – 2501 2014-10-07 16:33:46

+0

是的,我的問題是從類型*和const類型*轉換爲const void *。 – 2501 2014-10-07 16:34:17

+0

我想我必須相信你const int * const void *。 – 2501 2014-10-07 16:37:16

1

沒有與此呼叫

SomeFunc(&(int){ 12345 }) ; 

一個類似的例子有在C標準

drawline(&(struct point){.x=1, .y=1}, 
     &(struct point){.x=3, .y=4}); 

按照C標準沒有問題(6.5.2.2函數調用)

7如果表示被調用函數的表達式的類型爲 的確包含原型,則argume如果通過賦值將nts作爲 隱式轉換爲相應參數的類型,則將 的每個參數的類型作爲其 聲明類型的非限定版本。

看來C標準與轉換相比存在差距。在C++標準中描述了更詳細的隱式轉換。

1標準轉換是具有內置含義的隱式轉換。第4條列舉了一整套此類轉換。標準轉換序列是以下列順序的標準轉換序列:

- 從以下集合中進行零或一次轉換:左值到右值轉換,數組到指針轉換以及函數至指針轉換。

- 零或者選自以下組的一個轉換:積分促銷,浮點推廣,積分轉換,浮點轉換,浮積分轉換,指針轉換,指針構件轉換,和布爾轉換。

- 零或一個合格轉換。

因此,因爲它被認爲是標準的轉換序列包括一個指針轉換和和一個資格轉換。

C標準可以給出類似的詳細描述。

+0

什麼是drawline的原型。它是否需要const void *? – 2501 2014-10-07 15:55:12

+0

@ 2501從示例中可以看出,functopn接受兩個指向結構點的指針。不過,任何指針都可以隱式轉換爲void指針。所以const void *沒有問題。 – 2014-10-07 16:00:18

+0

你的最後一個陳述不符合邏輯前者。你能否詳細說明答案? – 2501 2014-10-07 16:01:55

相關問題