ポインタ定数、定数ポインタとポインタ定数を指すポインタ定数小結(C/C++)


ポインタ定数:
int a;
int *const pcb = &a;//constはポインタ宣言オペレータの右側に配置されます
constがポインタ宣言オペレータの右側にある限り、宣言されたオブジェクトは定数であり、その内容はポインタ、すなわちアドレスであることを示します.上記の宣言は、変数aのアドレス(変数aのアドレス、すなわち変数aを指すポインタ)である定数pcbを宣言する.
ポインタ定数は定数なので、宣言するときは必ず初期値を割り当てます.いったん値を割り当てると、後でこの定数は他のアドレスを指すことはできません.すなわち,ポインタ定数の指向アドレスは,いったん値を付与すると変更できない.
ポインタ定数の値は変更できませんが、ポインタが指すオブジェクトは可変です.ポインタが指すオブジェクトが定数であることを制限していないからです.
例:
(1)上記の通り:
int a;
int *const pcb = &a;//constはポインタ宣言オペレータの右側に配置されます
a=1;
#include
using namespace std;
int main()
{
	int a;
	int *const pcb = &a; //const            
	a = 1;
	cout << *pcb << endl;
	*pcb = 3;
	cout << *pcb << " \t" << a << endl;
	system("pause");
	return 0;
}

  :
1
3       3

(2)また
#include
using namespace std;
int main()
{
	char a[] = "abcde1234";
	char *const c = a;
	cout << c << endl;
	c[0] = 'x';
	cout << c << "\t" << a << endl;
	system("pause");
	return 0;
}
  :

abcde1234
xbcde1234       xbcde1234

二:定数ポインタ:
定数ポインタの使用は注意してください.ポインタが指すオブジェクトはこのポインタで修正できませんが、元の宣言で修正することができます.つまり、定数ポインタは変数のアドレスに値を付けることができます.定数ポインタとは、このポインタで変数の値を変更することを制限します.
形如:const int*p;
例:
   int a = 5;     const int b = 8;     const int *c = &a;//これは合法的で、不法なのはcに対する使用*c=6;//不正ですが、cが指すオブジェクトの値を変更できます:a=6;    const int *d = &b;//bは定数であり、dはbを指すことができ、dがbに割り当てられたアドレスは合法的である.
#include
using namespace std;
int main()
{
	int a = 5;
	const int b = 8;
	const int *c = &a; //      ,     c   
	cout << a << "\t" << *c << endl;
	a = 6;
	cout << a << "\t" << *c << endl;
	c = &b;
	cout << a << "\t" << *c << endl;
//	*c = 6; //   ,       c       :a = 6;
	const int *d = &b; // b   ,d    b,d    b       
	system("pause");
	return 0;
}
  :

5       5
6       6
6       8

三:定数を指すポインタ定数
C/C++では、次のように宣言されます.
  const int a = 25;
const int * const b = &a;
ポインタ宣言オペレータの左側にconstがあり、定数を指すポインタであることを示します.さらに、ポインタ宣言オペレータの右側にconstがあり、ポインタ定数が宣言されていることを示します.前後がロックされていると,指向するオブジェクトは変化せず,ポインタ定数自体も変化しない.
#include
using namespace std;
int main()
{
	char a[] = "abcde1234";
	const char b[] = "bcde"; // b             
	char *const c = a;  // c            
	const char * pc = a;  // pc         
	const char *const cpc = a; // cpc            
	const char *const d = b; // d            
	c[0] = 'x';
	cout << a << "\t" << c << "\t" << pc << "\t" << cpc << endl;
	a[1] = 'x';
	cout << a << "\t" << c << "\t" << pc << "\t" << cpc << endl;
//	pc[2] = 'x';//    
//	cpc[2] = 'x';//    
	system("pause");
	return 0;
}
  :

xbcde1234       xbcde1234       xbcde1234       xbcde1234
xxcde1234       xxcde1234       xxcde1234       xxcde1234
#include
using namespace std;
int main()
{
	const int a = 25;
	const int * const b = &a;
	cout << a << "\t" << *b << endl;
//	a = 1;//  
//	*b = 1;//  
	system("pause");
	return 0;
}
  :

25      25

四:まとめ
(1)ポインタ定数は,一度初期化すると指向オブジェクトを変更できない.すなわち、ポインタが指す場所は定数であり、アドレスを指す値は変更可能である.
(2)定数ポインタ,ポインタ指向値は定数であり,定数ポインタでは変更できない.オブジェクト自体を指すことでしか変更できません.
(3)定数を指すポインタ定数.理屈から言えば、彼は定数を指すべきで、この時アドレスを指すことも、アドレスを指す値を変えることもできません.ただし、定数でない場合は、指定されたオブジェクトの値を変更することで変更できます.