ポインタ変数をconstで修飾する方法ですが、以下の2つがあります。
int i = 100;
const int *cp1 = &i;
int *const cp2 = &i;
この違いですが、cp1 は「const int」へのポインタであるため cp1 を使って cp1 が指す値を変更することはできません。上の例では「*cp1 = 300」とするのは間違いです。ですが、cp1 には他のポインタアドレスを代入することはできます。
cp2 はアドレスの変更ができません。cp2 は常に変数iのアドレスを指します。ですが、cp2 を使って変数iの値を変更することはできます。
これらの動きを試したソースコードを載せておきます。
コピペ用です。
#include <stdio.h>
int main( void )
{
int i = 100;
int j = 200;
const int *cp1 = &i;
int *const cp2 = &i;
printf( "1: %d\n", *cp1);
/* cp1を使ってiは変更できないのでcp2を使う */
*cp2 = 300;
printf( "2: %d\n", *cp1 );
/* cp2のポインタの向き先は変えられないがcp1は変えられる */
cp1 = &j;
printf( "3: %d\n", *cp1 );
return 0;
}
実行結果は以下となります。
$ ./a.out
1: 100
2: 300
3: 200
ちなみに文字配列にconstを使用した以下の例は、どうなるかわかるでしょうか?
const char a[ ] = “Apple”;
char *const p = “Orange”;
Appleという文字列は変更できなくなります。ポインタ p の向き先を変更することもできません。またOrengeという文字列を変更しようとすると不定になります。これについてはこの記事を見てみてください。