Ano-Hacienda

長文が書きたい時の落書き帳。

ポインタを理解する

苦しんで覚えるC言語、通称「苦C」を最近読んでいる。
道中「はいはい他の言語でやった」と飛ばして、今Cの代名詞とも言えるポインタに入った。

今までやってきた言語(javascript,PHP)ではメモリなんて一切考えたことがなかったから、なかなか興味深い。
要するに、メモリの住所を指定するサムシングなのね。と何となーくの認識で読んでたら(ちゃんと理解せずに読み進めてたら意味ないぞ)この節で
引数による情報の受け渡し

C言語では、関数へ情報を渡す場合、必ず元の変数の値のコピーを渡します。
この様な方法を値渡しと呼び、元の変数の値が変更されないことが特徴です

えっそうなの!!?

ということで試しに簡単なコードを書いてみた。
関数で変数に10を足して表示させるだけ。

#include <stdio.h>

void func(int num);

int main(void)
{
    int num = 1;
    printf("%d\n",num); //実行結果1行目
    func(num); //↓の関数を実行。numに10足して結果表示
    printf("%d\n",num); //実行結果3行目

    return 0;
}

void func(int num)
{
    num += 10;
    printf("%d\n", num); //実行結果2行目
    
    return;
}

実行結果

1
11
1

わ、本当だ!mainの中の変数は変わってない!!

次に、上の苦Cの通り変数をポインタ変数に変えてみた。

#include <stdio.h>

void func(int *num); //引数宣言時にポインタ変数を宣言

int main(void)
{
    int num = 1; //ここは普通の変数でいい。らしい
    printf("%d\n",num);
    func(&num); //変数の”アドレス"を代入することでポインタ変数を代入になる。らしい
    printf("%d\n",num);

    return 0;
}

void func(int *num)
{
    *num += 10; //ポインタ変数を通常変数にして10足す
    printf("%d\n", *num); //通常変数を出力
    
    return;
}
1
11
11

おおー、ちゃんと上書きされてる。
ポインタの必要性わかってきたぞ。ポインタを制すればCを制すって聞いたことある(多分ない)し行ける気がするぞ。


と、思って読み進めたら配列だとまた挙動が変わってくるとか、、、
まだ道のりは長そうだ、これはまた次回