ポインタとは
変数のアドレスを記憶する変数のこと
ポインタ変数
#include <iostream> int main() { int apple = 101; //ポインタ変数 int *p; //&はアドレスを表す p = &apple; //*をつけるとアドレス先の値を表す std::cout << *p << std::endl; }
参照渡し
#include <iostream> void keisan(int &x) { //*をつけてアドレス先の値を変更する x = 25; } int main() { int apple = 101; //アドレスを渡す keisan(apple); //*をつけるとアドレス先の値を表す std::cout << apple << std::endl; }
ポインタ渡し
#include <iostream> void keisan(int *x) { //*をつけてアドレス先の値を変更する *x = 25; } int main() { int apple = 101; //アドレスを渡す keisan(&apple); //*をつけるとアドレス先の値を表す std::cout << apple << std::endl; }
ポインタと構造体(アロー演算子)
#include <iostream> struct Fruits { char name[128]; int price; int zaiko; }; int main() { Fruits store = {"apple", 150, 50}; Fruits *p; p = &store; //かっこがないと、(.)が優先されて動きが変わります。 std::cout << (*p).name << std::endl; std::cout << (*p).price << std::endl; std::cout << (*p).zaiko << std::endl; //上と同じ動きになる std::cout << p->name << std::endl; std::cout << p->price << std::endl; std::cout << p->zaiko << std::endl; }
ダブルポインタ
#include <iostream> int main() { int x = 10; //int型の変数 int *p; //int型のポインタ変数 p = &x; //ポインタpに変数xのアドレスを代入 int** pp; //int型ポインタ変数のポインタ pp = &p; //ダブルポインタppにポインタpのアドレスを代入 **pp = 15; //int型xの値を変更可能 //以下同じアドレス std::cout << &p << std::endl; std::cout << pp << std::endl; std::cout << x << std::endl; }
ダブルポインタを用いて、関数内で呼び出し元の値を変更
#include <iostream> //ダブルポインタとして、pのアドレスを受け取る void sum(int** goukei) { **goukei = 15; } int main() { int x = 10; //int型の変数 int *p; //int型のポインタ変数 p = &x; //ポインタpに変数xのアドレスを代入 //ポインタのアドレスを渡す sum(&p); std::cout << x << std::endl; }