!!!C++ ポインタ [C++][C++によるオブジェクト指向プログラミング] {{amazon 4756118895}} !!ポインタ型 *ポインタは、変数およびマシンアドレスを参照するのに使用 *配列および文字列の処理に緊密に結びついている *C++の配列は、連続したメモリに関連付けれられたインデックス付け可能な特殊なポインタ int* p; *上記は、pをintへのポインタ型として宣言している ::例 #include using namespace std; int main() { int i = 5; int* p = &i; // ポインタを i のアドレスに初期化 cout << *p << endl; // ポインタが指す変数の値を出力 int j = *p + 1; // ポインタが指す変数の値に +1 した値でjを初期化 cout << j << endl; p = &j; // j のアドレスをポインタに設定 cout << *p << endl; // p は j を指す } ::結果 W:\oop02\Debug>oop02.exe 5 6 6 !!ポインタベースの参照渡し +関数ヘッダでポインタパラメータを宣言 +関数本体でポインタを間接参照 +関数呼び出し時に、引数としてアドレスを渡す ::例 #include using namespace std; void sort(); // ポインタパラメータを宣言 void order(int*, int*); int main() { sort(); } void sort() { int nums[] = { 2, 34, 656, 767, 893, 123, 5, 7, 892, 4, 6, 81, 1134, 56, 3 }; int len = sizeof(nums) / sizeof(nums[0]); for (int i=0; i *m) { tmp = *n; *n = *m; *m = tmp; } } ::結果 W:\oop02\Debug>oop02.exe 2 3 4 5 6 7 34 56 81 123 656 767 892 893 1134 !!汎用ポインタ *void* gp のような汎用ポインタへは任意の型のアドレスを代入できる *間接参照はできない ::例 void* vp; // 汎用ポインタ int* ip; // int ポインタ char* cp; // char ポインタ int i = 10; char c = 'a'; // それぞれの型のポインタに値を設定 ip = &i; cp = &c; cout << *ip << "," << *cp << endl; vp = &i; // intポインタを 汎用ポインタに変換 int j = *reinterpret_cast(vp); // 汎用ポインタを intポインタに変換 cout << j << endl; vp = &c; // charポインタを 汎用ポインタに変換 char d = *reinterpret_cast(vp); // 汎用ポインタを charポインタに変換 cout << d << endl; // error C2100: 間接指定演算子 (*) の使い方が正しくありません。 // cout << *vp << endl; // 汎用ポインタの間接参照不可 // 'char *' から 'int *' に変換できません。 // ip = cp; // 異なる型のポインタへの変換不可 ::結果 10,a 10 a !!配列とポインタ *配列の名前それ自身ではアドレス(ポインタ値)である *配列は定数ポインタとみなすことのできる特定の固定アドレス *配列が宣言されるとコンパイラはすべての要素を記憶するのにたる記憶領域を割り当てる *配列のベースアドレスはメモリの先頭位置でインデックス0のアドレスと等しい ::例 const int SIZE = 5; int nums[SIZE] = {1,2,3,4,5}; // 連続したアドレスを確保 for (int i=0; i