2017-04-02 54 views
9
typedef float vec3[3]; 

void test(vec3 const vptr) { 
    *vptr = 1.f; // error: assignment of read-only location 
    vptr[0] = 1.f; // error: assignment of read-only location 
    vptr++; // no error 
} 

ç的typedef const的說法

vec3 const vptr 

一樣

const vec3 vptr 

所有類型定義?前兩者有什麼區別?我認爲

vec3 const vptr <==> float* const vptr // a constant pointer to an object 
const vec3 vptr <==> const float* vptr // a pointer to a constant object 
??? <==> const float* const vptr // a constant pointer to a constant object 

回答

4

此的typedef

typedef float vec3[3]; 

定義的別名陣列型float[3]

參數的此聲明

vec3 const vptr 

聲明vptr爲具有陣列型const float[3]

將指定爲具有數組類型的函數參數調整爲指向數組元素類型的對象的指針。

所以這個聲明

vec3 const vptr 

調整爲類型const float *vptr。這是一個常量對象的非常量指針。

這種關係

VEC3常量的vptr < ==>浮子* const的的vptr //一個常量指針到 對象

是錯誤的。此聲明

vptr++; // no error 

證實了這一點。

使用此類型定義

typedef float vec3[3]; 
+0

這與其說是'VEC3常量vptr'調整到'常量浮動* vptr'你不能把這個聲明

const float* const vptr 

。只是對於一個函數參數來說,兩者是等價的。 – Peter

+0

@彼得他們不是。數組參數實際上被調整爲某些(基本上全部)情況下的指針。弗拉德說,調整,而不是忽略這個細節更正確。 – 2501