C言語

【C言語】第4章第2回:ポインタとアドレス演算子(&と*)

ポインタを効果的に使うためには、アドレス演算子&と間接演算子*の仕組みを理解することが重要です。この章では、それぞれの使い方を具体例を交えて解説します。

1. アドレス演算子(&)とは?

アドレス演算子&は、変数のメモリアドレスを取得するために使用します。

例:アドレス演算子の基本的な使い方

#include <stdio.h>

int main() {
    int number = 42;

    printf("Value of number: %d\n", number);
    printf("Address of number: %p\n", (void*)&number); // アドレスを出力

    return 0;
}

解説:

  • &numberは、変数numberのメモリアドレスを取得します。
  • %pフォーマット指定子を使用してアドレスを表示します。

2. 間接演算子(*)とは?

間接演算子*は、ポインタが指すメモリアドレスに格納された値を取得または変更するために使用します。

例:間接演算子の基本的な使い方

#include <stdio.h>

int main() {
    int number = 42;
    int *ptr = &number; // numberのアドレスをptrに格納

    printf("Value of number: %d\n", number);
    printf("Value via ptr: %d\n", *ptr); // ポインタを使って値を取得

    *ptr = 99; // ポインタを使って値を変更
    printf("Updated value of number: %d\n", number);

    return 0;
}

解説:

  • *ptrを使用すると、ポインタが指すアドレスに格納された値にアクセスできます。
  • *ptr = 99;は、ポインタが指す変数の値を直接変更します。

3. &と*の組み合わせ

&*は、組み合わせて使うことで、ポインタの操作をより効果的に行えます。

例:アドレス演算子と間接演算子の連携

#include <stdio.h>

int main() {
    int number = 42;
    int *ptr = &number; // アドレスを取得してポインタに格納

    printf("Address of number: %p\n", (void*)&number);
    printf("Address stored in ptr: %p\n", (void*)ptr);

    printf("Value of number: %d\n", number);
    printf("Value via ptr: %d\n", *ptr);

    return 0;
}

解説:

  • int *ptr = &number;: numberのアドレスをポインタptrに格納。
  • *ptr: ptrが指すアドレスの値にアクセス。

4. 練習問題

以下の課題に挑戦して、&*の使い方をマスターしましょう。

  1. ポインタを使って、2つの整数の値を入れ替えるプログラムを作成してください。
  2. 配列の各要素のアドレスをポインタで取得し、それぞれの値を出力するプログラムを作成してください。
  3. ポインタを使って文字列を1文字ずつ出力するプログラムを作成してください。

5. 練習問題の解答と解説

問1の解答

#include <stdio.h>

void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

int main() {
    int a = 5, b = 10;

    printf("Before swap: a = %d, b = %d\n", a, b);
    swap(&a, &b);
    printf("After swap: a = %d, b = %d\n", a, b);

    return 0;
}

6. まとめ

&*は、ポインタ操作の基礎を理解するために不可欠な演算子です。この章で学んだ内容を応用して、ポインタを使いこなせるようになりましょう。