アドレスは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です。