見出し画像

No.23 ポインタについて(2)

今回は、C言語のポインタについて解説します。

前回の記事をまだ見ていない方は、下記のリンクからぜひ見てください。
前回の記事を見てからこの記事を見ると理解しやすいです。↓

また、わからない点があればぜひコメントお願いします。
わかりやすいように更新させていただきます。


ポインタを使ったアドレス表示

前回解説したように、ポインタは指定した変数のアドレスを格納するものです。なのでポインタの内容を表示させることで指定した変数のアドレスを表示させることができます。

ポインタ変数でアドレスを表示

ポインタの内容を表示させるのには printf関数を使います。
printf関数でポインタの内容を表示するには変換指定子の %p を使います。↓

printf("%p\n", ポインタ変数名);

アドレス演算子を使ってアドレスを表示

また、前回説明したようにアドレス演算子を使っても変数のアドレスを表示することが可能です。
アドレス変数を使う場合ポインタ関数は使わずアドレスを表示させたい変数名の前に&をつけます。
変換指定子はアドレスを表示させるので %p です。↓

printf("%p\n", &変数名);

この例では変数 num のアドレスをアドレス演算子とポインタ関数を使って出力します。

#include <stdio.h>

int main() {
    int num = 10;
    int *ptr = &num;

    // 変数numのアドレスを表示
    printf("numのアドレス: %p\n", &num);

    // ポインタ変数ptrが保持しているアドレスを表示
    printf("ptrが保持するアドレス: %p\n", ptr);

    return 0;
}

このプログラムの出力結果は次のようになります。↓

numのアドレス: 0x7ffeefbff81c  // 実際のアドレスは実行環境によって異なる
ptrが保持するアドレス: 0x7ffeefbff81c

アドレスが同じなのでどちらも変数 num のアドレスを出力していることがわかります。

ポインタ変数を使いアドレス先の内容を表示

ポインタ変数は指定した変数のアドレスを表示するだけでなく、そのアドレスに格納されている内容を表示することもできます。

アドレス先の内容を printf関数で表示するには変換指定子をアドレス先に格納されているものの型と対応するものにします。
また、ポインタ関数名の前に * をつけます。↓

printf("対応する変換指定子\n", *ポインタ変数名);

次のプログラムは、変数 num 内容をポインタ変数を使い出力するものです。↓

#include <stdio.h>

int main() {
    int num = 10;
    int *ptr = &num;

    printf("ptrのアドレス先の値: %d\n", *ptr);
    printf("numの値: %d\n", num);

    return 0;
}

このプログラムの実行結果は次のようになります。↓

ptrのアドレス先の値: 10
numの値: 10

内容が同じことがわかると思います。

問題

int x = 10;
int *ptr = &x;

printf("%p\n", &x);  
printf("%p\n", ptr); 
printf("%d\n", *ptr); 

の実行結果を示してください。

回答例

0x7ffeefbff81c
0x7ffeefbff81c
10

アドレスは実行環境によって違います

解説

  • int *ptr = &x; : 整数型のポインタ変数 ptr を宣言し、変数 x のアドレスを ptr に代入します。つまり、ptr は x の場所を指し示すようになります。

  • printf("%p\n", &x); : 変数 x のアドレスを表示します。&x は x のアドレスを取得する演算子です。

  • printf("%p\n", ptr); : ポインタ ptr が保持しているアドレス、つまり x のアドレスを表示します。

  • printf("%d\n", *ptr); : ポインタ ptr が指している値、つまり x の値 (10) を表示します。*ptr はポインタが指す値を取得します

今回は以上です。

いいなと思ったら応援しよう!