第10章の1 変数とポインタ

1. ポインタとは

ポインタとは、「変数のアドレスを記憶する変数」と定義することができます。
C言語の特徴にポインタが使用できることがあげられますが、ポインタからC言語がわからなくなったという話もよく耳にします。
しかし、順を追ってきちんと消化していけば、ポインタは難しいものではありません。読み飛ばさず、じっくりと理解するようにしてください。

2. 変数とポインタ

(1) 変数とアドレス

ポインタについて理解するには「アドレス」とは何かをまず理解してください。

int a = 123; 

は実際には下図のように、 「メモリ上のある番地(下図では1000番地)に変数a としての領域を確保し、 その領域に 123 を格納する」ということになります。

この時、

  • a : 変数a の値(123)を示す
  • &a : 変数a のアドレス(1000)を示す

と表現します。

実は

int a;
scanf("%d", &a);

は、「変数a のアドレスが示すメモリエリアに入力データを10進整数変換して格納」の意味になります。

(2) ポインタは変数のアドレスを記憶する変数

ポインタとはアドレス変数、つまり変数のアドレスを記憶する変数のことです。

(3) ポインタの宣言と使い方(変数のアドレスを格納)

ポインタは必ず、

  1. 宣言
  2. 値(アドレス)の設定
  3. 使用

の 3ステップで用います。

ちょっと面倒ですが、下の使い方をよく見て、この 3ステップを確認してください。
間違いやすいのは「*」の使い方です。 各ステップで「*」がどのように使われているかよく注意してください。

int *p;      // ポインタの宣言
p = &a;      // ポインタに変数のアドレスを設定

は、以下のようにまとめて書くこともできます。

int *p = &a;    // ポインタの宣言して変数のアドレスで初期化
// ポインタの使用例
#include <stdio.h>

int main(void)
{
    int a, b;
    int *p;      // ポインタの宣言

    p = &a;      // ポインタに変数のアドレスを設定

    *p = 100;    // ポインタを使ったデータのアクセス
    b = *p + 1;

    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("*p = %d\n", *p);

    return 0;
}

【実行結果例】
a = 100
b = 101
*p = 100

〇 演習

問1

空欄部を埋めて「ポインタが指している値を表示するプログラム」を完成しなさい。

#include <stdio.h>

int main(void)
{
    char c;
    ______;            // ポインタの宣言
    
    c = 'A';
    p = _______;       // ポインタの値設定
    printf("%c\n", _______);    // ポインタの指す値を表示
    
    return 0;
}

【実行結果例】
A

問2

空欄部を埋めて「ポインタが指している中身を+2するプログラム」を完成しなさい。

#include <stdio.h>

int main(void)
{
    char c = 'A';
    ___________;              // ポインタの宣言とアドレスの初期化

    
    printf("%c\n", _______);  // ポインタの指す値を表示
    _______;                  // ポインタの指す値を+2
    printf("%c\n", _______);  // ポインタの指す値を表示
    
    return 0;
}

【実行結果例】
A
C

問3

空欄部を埋めて「変数のアドレス、値、ポインタ、ポインタの指す値を表示するプログラム」を完成しなさい。

#include <stdio.h>

int main(void)
{
    int a = 611, *ptr;
    
    ptr = &a;        // ポインタの値設定
    printf("変数 a のアドレス = %p\n", _______);
    printf("変数 a の値 = %d\n",_______);
    printf("ポインタ ptr の値 = %p\n",_______);
    printf("ポインタ ptr の指す値 = %d\n",_______);
    
    return 0;
}

// %pはアドレスを表示するための変換指定

【実行結果例】
変数 a のアドレス = 00000048D2DFF8A4
変数 a の値 = 611
ポインタ ptr の値 = 00000048D2DFF8A4
ポインタ ptr の指す値 = 611

赤文字部分は環境によって異なります。

解答例

// 問1
#include <stdio.h>

int main(void)
{
    char c;
    char *p;            // ポインタの宣言
    
    c = 'A';
    p = &c;             // ポインタの値設定
    printf("%c\n", *p); // ポインタの指す値を表示
    
    return 0;
}
// 問2
#include <stdio.h>

int main(void)
{
    char c = 'A';
    char *p = &c;             // ポインタの宣言とアドレスの初期化

    
    printf("%c\n", *p);       // ポインタの指す値を表示
    *p += 2;                  // ポインタの指す値を+2
    printf("%c\n", *p);       // ポインタの指す値を表示
    
    return 0;
}
// 問3
#include <stdio.h>

int main(void)
{
    int a = 611, *ptr;
    
    ptr = &a;        // ポインタの値設定
    printf("変数 a のアドレス = %p\n", &a);
    printf("変数 a の値 = %d\n",a);
    printf("ポインタ ptr の値 = %p\n",ptr);
    printf("ポインタ ptr の指す値 = %d\n",*ptr);
    
    return 0;
}


コメント