C言語-超基本その5-

C言語独学の超基本のメモ、5回目。

ポインタについて。

ポインタ
  • ポインタは、ショートカット機能
  • ポインタでつながれると住所と値を共有する

〇ポインタの利点

  • 大きなプログラムのある場所まで一瞬で移動

  • コードを書く手間が省ける

  • 特定の住所を指定することで、ピンポイントで値を操作することも可能になる。 (関数の外から、中にある変数の値を変更する。 →普段いじれないデータもピンポイントで操作可能。)

  • 関数から複数の戻り値を返せる

ポインタの例

「ポインタ変数(hoge)」は変数名の前に「*」(アスタリスク)を付けて宣言する。「ポインタ変数(hoge)」には「変数(apple)のアドレス」を代入する。

「変数(apple)のアドレス」は、変数名の前に「&」(アンパサンド)を付けて表す。

変数とポインタ変数は同じ型(intなど)にする。

int *hogeint 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など各メディアは泉市長のインタビューを報道中止

〇「警告!! 日本は既に中国共産党に乗っ取られている」