アドレスは16進数を使ってx01000, 0x1004などで表す
メモリのアドレスは&変数名を使う
int main() { int a; a = 5; cout << "変数aの値は" << a << "です。\n"; cout << "変数aのアドレスは" << &a << "です。\n"; return 0; }
$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
変数aのアドレスは0xffffc948bd84です。
### ポインタ
アドレスを格納する特殊な変数
int main() { int a; int* pA; a = 5; pA = &a; cout << "変数aの値は" << a << "です。\n"; cout << "変数aのアドレス(&a)は" << &a << "です。\n"; cout << "ポインタpAの値は" << pA << "です。\n"; return 0; }
$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
変数aのアドレス(&a)は0xffffe5f9f30cです。
ポインタpAの値は0xffffe5f9f30cです。
ポインタから変数の値を知るには *pAとする
int main() { int a; int* pA; a = 5; pA = &a; cout << "変数aの値は" << a << "です。\n"; cout << "変数aのアドレス(&a)は" << &a << "です。\n"; cout << "ポインタpAの値は" << pA << "です。\n"; cout << "*pAの値は" << *pA << "です。\n"; return 0; }
$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
変数aのアドレス(&a)は0xffffc90c856cです。
ポインタpAの値は0xffffc90c856cです。
*pAの値は5です。
### ポインタに別のアドレスを代入する
int main() { int a = 5; int b = 10; int* pA; pA = &a; cout << "変数aの値は" << a << "です。\n"; cout << "ポインタpAの値は" << pA << "です。\n"; cout << "*pAの値は" << *pA << "です。\n"; pA = &b; cout << "変数bの値は" << b << "です。\n"; cout << "ポインタpAの値は" << pA << "です。\n"; cout << "*pAの値は" << *pA << "です。\n"; return 0; }
$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
ポインタpAの値は0xffffd6b96088です。
*pAの値は5です。
変数bの値は10です。
ポインタpAの値は0xffffd6b9608cです。
*pAの値は10です。
### ポインタを使って変数を変更する
int main() { int a = 5; int* pA; pA = &a; cout << "変数aの値は" << a << "です。\n"; *pA = 50; cout << "*pAに50を代入しました。\n"; cout << "aの値は" << a << "です。\n"; return 0; }
$ g++ -o sample sample.cpp && ./sample
変数aの値は5です。
*pAに50を代入しました。
aの値は50です。
なぜこのような機能があるか??
### 引数とポインタ
swapの誤ったコード
void swap(int x, int y); int main() { int num1 = 5; int num2 = 10; cout << "変数num1の値は" << num1 << "です。\n"; cout << "変数num2の値は" << num2 << "です。\n"; cout << "変数num1とnum2の値を交換します。\n"; swap(num1, num2); cout << "変数num1の値は" << num1 << "です。\n"; cout << "変数num2の値は" << num2 << "です。\n"; return 0; } void swap(int x, int y){ int tmp; tmp = x; x = y; y = tmp; }
$ g++ -o sample sample.cpp && ./sample
変数num1の値は5です。
変数num2の値は10です。
変数num1とnum2の値を交換します。
変数num1の値は5です。
変数num2の値は10です。
通常の値渡しでは、実引数を変更することができない。
アドレスを引数にすると、変更することができる。
void swap(int* x, int* y); int main() { int num1 = 5; int num2 = 10; cout << "変数num1の値は" << num1 << "です。\n"; cout << "変数num2の値は" << num2 << "です。\n"; cout << "変数num1とnum2の値を交換します。\n"; swap(&num1, &num2); cout << "変数num1の値は" << num1 << "です。\n"; cout << "変数num2の値は" << num2 << "です。\n"; return 0; } void swap(int* px, int* py){ int tmp; tmp = *px; *px = *py; *py = tmp; }
$ g++ -o sample sample.cpp && ./sample
変数num1の値は5です。
変数num2の値は10です。
変数num1とnum2の値を交換します。
変数num1の値は10です。
変数num2の値は5です。