2017-04-02 30 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 
} 

tüm typedefs içinC typedef const argüman

const vec3 vptr 

aynı

vec3 const vptr 

mi? Son iki arasında bir fark var mı? I

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 

cevap

4

typedef float vec3[3]; 

dizi türü float[3]

dizi türü const float[3] sahip olarak

vec3 const vptr 

vptr bildirir parametrenin Bu beyan için bir takma ad tanımlar Bu typedef düşünülmektedir.

Dizi türlerine sahip olarak belirtilen işlev parametreleri, dizi öğesi türlerinin nesnelerine işaretçiler olarak ayarlanır.

Yani bu beyan

vec3 const vptr 

tip const float *vptr ayarlanır. Bu, sabit bir nesneye sabit olmayan bir işaretçidir. Bir nesne

için < ==> şamandıra * const vptr // sabit işaretçi vptr

Bu ilişki

vec3 const yanlıştır. Ve bu ifade

onaylar.

Sen O const şamandıra * vptr` `ayarlanır vptr` o` vec3 const o kadar fazla değil bu typedef

typedef float vec3[3]; 
+0

kullanarak bu bildiriyi

const float* const vptr 

alınamıyor. Sadece, bir fonksiyon parametresi için, ikisi de eşdeğerdir. – Peter

+0

@Peter Onlar değil. Dizi parametreleri aslında (temel olarak tüm) koşullarda işaretçilere ayarlanır. Bu düzeltmeyi görmezden gelmek yerine, ayarlanmış dendiğinde Vlad daha doğrudur. – 2501