2017-04-02 2 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のためCのtypedef constの引数

const vec3 vptr 

と同じ

vec3 const vptr 

ですか?最後の2つの間に違いはありますか?私は

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 float vec3[3]; 

が配列型float[3]

配列型const float[3]を有するよう

vec3 const vptr 

vptr宣言パラメータのこの宣言のエイリアスを定義する。このタイプ定義を考えました。

配列型を持つものとして指定された関数パラメータは、配列要素型のオブジェクトへのポインタに調整されます。

したがって、この宣言

vec3 const vptr 

はタイプconst float *vptrに調整されます。つまり、定数オブジェクトへの非定数ポインタです。 オブジェクト

から< ==>フロート*のconstのvptr //定数ポインタvptr

この関係

vec3のconstが間違っています。そして、このステートメント

vptr++; // no error 

を確認します。

あなたはそれは `のconst vptr` vec3` constのフロート*のvptr`に調整されていることはあまりありません。このtypedefを

typedef float vec3[3]; 
+0

を使用して、この宣言

const float* const vptr 

を取得することはできません。それは、関数のパラメータの場合、2つは同等です。 – Peter

+0

@Peterそうではありません。配列パラメータは、特定の(基本的にはすべての)状況で実際にポインタに調整されます。 Vladは、この詳細を無視するよりも、調整されたと言った方が正しいです。 – 2501

関連する問題