Share via


定数ポインターと揮発性

ポインターの処理方法を 定数揮発性 キーワードの変更。 定数 のキーワードはポインターを初期化した後で変更できないことを指定します ; ポインターはその変更から保護されます。

volatile のキーワードに続く名前が付けられた値がユーザーのアプリケーションの場合以外の操作によって変更できることを指定します。したがってvolatile のキーワードは複数のプロセスや割り込みサービス ルーチンの通信に使用するグローバル データの領域アクセスできる共有メモリにオブジェクトを宣言する場合に便利です。

名前が volatile として宣言するとコンパイラはプログラムによってアクセスされるたびにメモリから値を読み込みます。これはで可能な最適化が低下します。ただしオブジェクトの状態が予期せず変更すると予測可能プログラムのパフォーマンスを確認する唯一の方法です。

オブジェクトを宣言するには 定数 としてポインターが指すしたかvolatile はフォームの宣言を使用して :

const char *cpch;
volatile char *vpch;

ポインター。つまりポインターに格納されているアドレス —実際の値を 定数 または volatile として宣言するにはフォームの宣言の使用 :

char * const pchc;
char * volatile pchv;

C++ 言語では 定数 として宣言されたオブジェクトやポインターの変更を使用できるようになります。このような割り当てはオブジェクトまたはポインターが宣言されたこれにより元の宣言の意図に違反する情報を削除。次に宣言の例を示します。

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

2 個のオブジェクト (cch は型の const charch の前の宣言を型指定の **char)**次の宣言と初期化有効です :

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;

次の宣言と初期化が誤っています。

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

したがって pch2 の宣言は定数オブジェクトが変更される可能性がある宣言しポインターを拒否されます。pch3 の宣言は pointer が設定されていることをオブジェクトを指定します ; 宣言によって同じ理由での宣言 pch2 拒否される拒否されます。

次の 8 種類の割り当てはポインターを使用して割り当てると前の宣言のポインター値の変更を示しています ; 初期化が pch8 によって pch1 に正しかったとこれまでにあるとします。

*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

volatileまたは 定数 と volatile の組み合わせとして宣言されていませんが同じ規則に従います。

定数 のオブジェクトへのポインターが次のように関数宣言で使用されています :

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

このステートメントは3 種類の引数の 2 つが char に型のポインター関数strcpy_s を宣言します。引数が値ではなく参照渡しされるため関数が strSource が 定数 として宣言していない場合 strDestination と strSource の両方を変更できます。 定数 として strSource の宣言は strSource が呼び出された関数によって変更できません。呼び出し元が保証します。

[!メモ]

型名 * から 定数型名 * への標準的な変換があるため strcpy_schar * 型の引数を渡す場合はあります。ただし上下はコントロールではありません ; 暗黙の型変換はオブジェクトまたはポインターから 定数 の属性を削除する場合はありません。

指定した型の 定数 のポインターは型のポインターに割り当てることができます。ただし 定数 ではないポインターは 定数 のポインターに割り当てることはできません。次のコードが正しく不正な割り当ても示します :

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

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

次の例はオブジェクトへのポインターを指すポインターがある定数としてオブジェクトを宣言する方法を示します。

// 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;
}

参照

関連項目

ポインター