Aracılığıyla paylaş


const ve volatile işaretçiler

Const ve volatile anahtar sözcükleri, işaretçilerin nasıl ele alınma şeklini değiştirir. const anahtar sözcüğü, işaretçinin başlatmadan sonra değiştirilemeyeceğini belirtir; işaretçi bundan sonra değiştirilmeye karşı korunur.

anahtar sözcüğü, volatile aşağıdaki adla ilişkilendirilmiş değerin kullanıcı uygulamasındakiler dışındaki eylemler tarafından değiştirilebileceğini belirtir. Bu nedenle anahtar sözcüğü, volatile paylaşılan bellekte birden çok işlem veya kesme hizmeti yordamlarıyla iletişim için kullanılan genel veri alanları tarafından erişilebilen nesneleri bildirmek için kullanışlıdır.

Bir ad olarak volatilebildirildiğinde, derleyici program tarafından her erişildiğinde değeri bellekten yeniden yükler. Bu, olası iyileştirmeleri önemli ölçüde azaltır. Ancak, bir nesnenin durumu beklenmedik bir şekilde değiştiğinde, yalnızca bu şekilde tahmin edilebilir program performansı sağlanabilir.

İşaretçi tarafından işaret edilen nesneyi veya constolarak volatile bildirmek için formun bir bildirimini kullanın:

const char *cpch;
volatile char *vpch;

İşaretçinin değerini (yani, işaretçide depolanan gerçek adresi) veya constolarak volatile bildirmek için formun bir bildirimini kullanın:

char * const pchc;
char * volatile pchv;

C++ dili, olarak constbildirilen bir nesnenin veya işaretçinin değiştirilmesine izin verecek atamaları engeller. Bu tür atamalar, nesne veya işaretçinin birlikte bildirildiği bilgileri kaldırarak orijinal bildirimin amacını ihlal eder. Aşağıdaki bildirimleri dikkate alın:

const char cch = 'A';
char ch = 'B';

İki nesnenin önceki bildirimleri (cchconst charch), aşağıdaki bildirim/başlatmalar geçerlidir:

const char *pch1 = &cch;
const char *const pch4 = &cch;
const char *pch5 = &ch;
char *pch6 = &ch;
char *const pch7 = &ch;
const char *const pch8 = &ch;

Aşağıdaki bildirim/başlatmalar hatalıdır.

char *pch2 = &cch;   // Error
char *const pch3 = &cch;   // Error

pch2 bildirimi, sabit bir nesnenin değiştirilebileceği ve bu nedenle izin verilmeyen bir işaretçiyi bildirir. bildirimi pch3 , işaretçinin nesne değil sabit olduğunu belirtir; bildirime izin verilmemesiyle aynı nedenden dolayı bildirime pch2 izin verilmez.

Aşağıdaki sekiz atama, işaretçiyle atama ve önceki bildirimler için işaretçi değerinin değiştirilmesini göstermektedir; şimdilik başlatmanın pch1 ile pch8 arasında doğru olduğunu varsayın.

*pch1 = 'A';  // Error: object declared const
pch1 = &ch;   // OK: pointer not declared const
*pch2 = 'A';  // OK: normal pointer
pch2 = &ch;   // OK: normal pointer
*pch3 = 'A';  // OK: object not declared const
pch3 = &ch;   // Error: pointer declared const
*pch4 = 'A';  // Error: object declared const
pch4 = &ch;   // Error: pointer declared const

olarak veya ile 'nin volatileconstbir karışımı olarak bildirilen volatileişaretçiler aynı kurallara uyar.

Nesnelere yönelik const işaretçiler genellikle işlev bildirimlerinde aşağıdaki gibi kullanılır:

errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );

Yukarıdaki deyim, char bir işlev bildirir. Bağımsız değişkenler değere göre değil başvuruya göre geçirildiğinden, işlevin hem hem de olarak strDestinationbildirilmemesi durumunda strSource değişiklik strSourceconst yapmak serbest olur. olarak strSource bildirimiconst, çağıranın strSource çağrılan işlev tarafından değiştirilememesini sağlar.

Not

tür adından *standart bir dönüştürme olduğundan, türünde char *bir bağımsız değişkenin strcpy_s geçirilmesi yasaldır. Ancak tersi doğru değildir; özniteliğini bir nesneden veya işaretçiden kaldırmak const için örtük dönüştürme yok.

const Belirli bir tür işaretçisi, aynı türdeki bir işaretçiye atanabilir. Ancak, işaretçiye atanamayan const bir const işaretçi. Aşağıdaki kod, doğru ve hatalı atamaları gösterir:

// const_pointer.cpp
int *const cpObject = 0;
int *pObject;

int main() {
pObject = cpObject;
cpObject = pObject;   // C3892
}

Aşağıdaki örnekte, bir nesnenin işaretçisinin işaretçisi varsa bir nesnenin nasıl const olarak bildirileceği gösterilmektedir.

// const_pointer2.cpp
struct X {
   X(int i) : m_i(i) { }
   int m_i;
};

int main() {
   // correct
   const X cx(10);
   const X * pcx = &cx;
   const X ** ppcx = &pcx;

   // also correct
   X const cx2(20);
   X const * pcx2 = &cx2;
   X const ** ppcx2 = &pcx2;
}

Ayrıca bkz.

İşaretçileri
Ham işaretçiler