auの日記

プログラミング初心者の日記。(auはハンドルネームです)

C言語でポインタ変数

auです。
前回はアドレスについて勉強しました。
program-shoshinsya.hatenablog.com
今回は、それを使ってプログラムするポインタ変数について書きたいと思います。

ポインタ変数とは

ポインタ変数とは、アドレスを代入する変数のことです。
ポインタ変数の宣言の仕方は、変数の前に「*」を付けることです。

int *p;

これで変数名pであるポインタ変数の宣言ができました。
このポインタ変数にアドレスaを代入します。

int a;
int *p;
p = &a;

これでアドレスをポインタ変数に代入ができます。代入するときには、"*p"ではなく"p"に代入します。
"char型"を"int型のポインタ変数"に代入できないようになっているので代入する型は合わせましょう。
実際にプログラミングしてみます。

#include<stdio.h>

int main(void) {
    int a; // int型変数a
    int *p; // ポインタ変数p
    a = 1;
    printf("aのアドレス: %p\n", &a);
    p = &a; //aのアドレスをpに代入
    printf("ポインタ変数pのアドレス: %p\n", p);
    printf("ポインタ変数pの値: %d\n", *p);
    return 0;
}

// 実行結果
aのアドレス: 0x7fffbfc9217cポインタ変数pのアドレス: 0x7fffbfc9217c
ポインタ変数pの値: 1

変数aも変数pも、intで宣言したのにも関わらず同じアドレスになりました。
次にint型の変数iを宣言してみました。

#include<stdio.h>

int main(void) {
    int a; // int型変数a
    int *p; // ポインタ変数p
    int i;
    a = 1;
    printf("aのアドレス: %p\n", &a);
    p = &a; //aのアドレスをpに代入
    printf("ポインタ変数pのアドレス: %p\n", p);
    printf("ポインタ変数pの値: %d\n", *p);
    i = 2;
    printf("iのアドレス: %p\n", &i);
    p = i;
    printf("ポインタ変数pのアドレス(i): %p\n", p);
    printf("ポインタ変数pの値(i): %d\n", *p);
    return 0;
}
// 実行結果

// gcc(コンパイル)したとき
pointa.c: In function ‘main’:
pointa.c:13:7: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
     p = i;
       ^

// ./a.outしたとき
aのアドレス: 0x7ffff5c9ef58
ポインタ変数pのアドレス: 0x7ffff5c9ef58
ポインタ変数pの値: 1
iのアドレス: 0x7ffff5c9ef5c
ポインタ変数pのアドレス(i): 0x2
Segmentation fault (core dumped)

"&i"ではなく"i"を代入しましたが"warning"となってしまいました。
最後のprintがちゃんと行われておらず、faultと言われているのでできないみたいです。
次はちゃんと"&i"で代入してみます。

#include<stdio.h>

int main(void) {
    int a; // int型変数a
    int *p; // ポインタ変数p
    int i;
    a = 1;
    printf("aのアドレス: %p\n", &a);
    p = &a; //aのアドレスをpに代入
    printf("ポインタ変数pのアドレス: %p\n", p);
    printf("ポインタ変数pの値: %d\n", *p);
    i = 2;
    printf("iのアドレス: %p\n", &i);
    p = &i;
    printf("ポインタ変数pのアドレス(i): %p\n", p);
    printf("ポインタ変数pの値(i): %d\n", *p);
    return 0;
}

// 実行結果
aのアドレス: 0x7fffc9667478
ポインタ変数pのアドレス: 0x7fffc9667478
ポインタ変数pの値: 1
iのアドレス: 0x7fffeec19f5c
ポインタ変数pのアドレス(i): 0x7fffc966747c
ポインタ変数pの値(i): 2

今度は"warning"といわれずにすみました。
"a"と"i"がどのアドレスにあるのかを知ることができました!