C言語-超基本その5-
C言語独学の超基本のメモ、5回目。
ポインタについて。
ポインタ
- ポインタは、ショートカット機能
- ポインタでつながれると住所と値を共有する
〇ポインタの利点
-
大きなプログラムのある場所まで一瞬で移動
-
コードを書く手間が省ける
-
特定の住所を指定することで、ピンポイントで値を操作することも可能になる。 (関数の外から、中にある変数の値を変更する。 →普段いじれないデータもピンポイントで操作可能。)
-
関数から複数の戻り値を返せる
ポインタの例
「ポインタ変数(hoge)」は変数名の前に「*」(アスタリスク)を付けて宣言する。「ポインタ変数(hoge)」には「変数(apple)のアドレス」を代入する。
「変数(apple)のアドレス」は、変数名の前に「&」(アンパサンド)を付けて表す。
変数とポインタ変数は同じ型(intなど)にする。
int *hoge
はint apple
の住所を指し示す。
#include <stdio.h>
int main (void){
int apple = 10;
int *hoge;
hoge = &apple; //hogeの住所はappleと同じ
printf("%d\n", apple); //10
printf("%d\n", *hoge); //10
return 0;
}
ポインタ型
ポインタには3つの機能がある。
- ポインタ型:データ型
- ポインタ値:参照先のアドレス
- ポインタ変数:実際に入っている値
〇ポインタ型
ポインタ変数のデータ型:int, doubleなど。
ポインタ型の特徴は、実態のあるデータ型とセットで利用する点。
int へのポインタ型はint:同じ大きさにしておく必要がある。
int apple = 10
という実態のある変数があるから、ポインタは存在することができる。
〇ポインタ値:参照先の住所(アドレス)のこと
ポインタ型の変数が記憶できる数値。
#include <stdio.h>
int main (void){
int apple, *hoge;
hoge = &apple; //hogeにappleの住所を指定
printf("%p\n", apple); //住所を表示:0020A000
printf("%p\n", hoge); //apple と同じ住所になる: 0020A000
return 0;
}
//ポインタのポインタ値(ポインタのアドレス)は、参照先のアドレスと同じになる。
〇ポインタ変数
1:別の変数のアドレスを代入できる。
例:int apple = 10 のアドレスを指し示すことで、10という数値を別の場所で使えるようになる。
2:参照先のデータを読み書きができる。
ポインタ変数には、「ポインタ変数モード」と「通常変数モード」がある。
- ポインタ変数モード(参照先と同じ値)
- 通常変数モード(参照先の値を操作できる)
ポインタ変数モードは、アドレスの記憶のみ。アドレスへの代入。足し算引き算。
通常変数モードは、色々な演算子を使って計算したり、参照先の値を書き換えることもできる。
〇ポインタ変数の宣言
int *p; //こちらがおすすめ
int* p;
int* p1,p2;
p1はポインタ、p2は通常のint型変数になるが、分かりにくいので、int *p1,p2;
のようにポインタにしたい変数に「*」を付けると良い。
〇アドレス代入
int *p,i;
p = &i;
&演算子:それが付いた変数のアドレスを求める。
#include <stdio.h>
int main (void){
int *apple, orange;
apple = &orange;
printf("%p\n", apple); //同じアドレスが出力される
printf("%p\n", &orange); //同じアドレスが出力される
return 0;
}
〇参照先の値を変更
#include <stdio.h>
int main (void){
//通常のint型の変数iと、int型のポインタpを宣言
int *p, i;
//pにiのアドレスを代入。ポインタ変数モード。
p = &i;
//*pに15を代入すると、iにも15が代入される。通常変数モード。
*p = 15;
printf("%d\n", *p); //15
printf("%d\n", i); //15
return 0;
}
- アドレス演算子&は変数のアドレスを求めるための計算記号なので、ポインタのモードを切り替えているわけではない
- コンパイルするときにアドレスとして置き換わるだけであって、モード切り替えをしているわけではない
〇ポインタを使って複数の戻り値を返す
一つの関数で、複数の変数を返すには、ポインタを使う。
#include <stdio.h>
void keisan(int x, int y, int *a1, int *a2); //プロトタイプ宣言
int main (void){
int tasizan; //実態のある変数
int hikizan; //実態のある変数
keisan(30, 10, &tasizan, &hikizan);
printf("%d\n", tasizan); //40
printf("%d\n", hikizan); //20
return 0;
}
//x,yは外から代入するため、a1,a2は結果を読み込むための変数
void keisan(int x, int y, int *a1, int *a2){
*a1 = x + y;
*a2 = x - y;
}
参照:
https://youtu.be/UWI4ultTvI8?t=14266
https://qiita.com/keitean/items/078159ff0f3dc3a361e9
お薦め
〇 パソナの闇を暴いた明石市の泉房穂市長は、“特別会計”の実態を暴こうとして殺された「石井紘基」の議員秘書 NHKなど各メディアは泉市長のインタビューを報道中止