【C言語】ポインタとアドレスの違いについて解説

目次から探す

ポインタとアドレスの応用例

配列とポインタの関係

配列とポインタは密接な関係があります。

実際、配列名は、その配列の先頭要素へのポインタとして解釈されます。

以下に、配列とポインタの関係を示すサンプルコードを示します。

#include <stdio.h>
int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = arr; // 配列の先頭要素へのポインタ
    printf("配列の先頭要素の値: %d\n", *ptr); // 配列の先頭要素の値を表示
    // ポインタを使って配列の要素にアクセス
    printf("配列の2番目の要素の値: %d\n", *(ptr + 1));
    printf("配列の3番目の要素の値: %d\n", *(ptr + 2));
    return 0;
}

上記のコードでは、arrという名前の配列を宣言し、その先頭要素へのポインタをptrという変数に代入しています。

ptrを使って配列の要素にアクセスすることができます。

*(ptr + 1)は、ptrの指すアドレスから1つ進んだ位置の要素の値を取得することを意味します。

実行結果は以下のようになります。

配列の先頭要素の値: 1
配列の2番目の要素の値: 2
配列の3番目の要素の値: 3

動的メモリの確保と解放

C言語では、malloc()関数を使って動的にメモリを確保し、free()関数を使ってメモリを解放することができます。

以下に、動的メモリの確保と解放のサンプルコードを示します。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int *ptr;
    // メモリの確保
    ptr = (int *)malloc(5 * sizeof(int));
    if (ptr == NULL) {
        printf("メモリの確保に失敗しました。\n");
        return 1;
    }
    // メモリに値を代入
    for (int i = 0; i < 5; i++) {
        *(ptr + i) = i + 1;
    }
    // メモリの内容を表示
    for (int i = 0; i < 5; i++) {
        printf("%d ", *(ptr + i));
    }
    printf("\n");
    // メモリの解放
    free(ptr);
    return 0;
}

上記のコードでは、malloc()関数を使って5つの整数型のメモリ領域を確保し、その先頭アドレスをptrに代入しています。

ptrを使ってメモリに値を代入し、その内容を表示しています。

最後に、free()関数を使ってメモリを解放しています。

実行結果は以下のようになります。

1 2 3 4 5

構造体とポインタの関係

構造体とポインタも密接な関係があります。

構造体は、複数の異なるデータ型をまとめて扱うためのものであり、ポインタを使って構造体のメンバにアクセスすることができます。

以下に、構造体とポインタの関係を示すサンプルコードを示します。

#include <stdio.h>
// 構造体の定義
struct Person {
    char name[20];
    int age;
};
int main() {
    struct Person person1 = {"John", 25};
    struct Person *ptr = &person1; // 構造体へのポインタ
    printf("名前: %s\n", ptr->name); // 構造体のメンバにアクセス
    printf("年齢: %d\n", ptr->age);
    return 0;
}

上記のコードでは、Personという構造体を定義し、person1という変数を宣言しています。

その後、ptrというポインタを使ってperson1のアドレスを代入しています。

ptr->nameは、ptrが指す構造体のnameメンバにアクセスすることを意味します。

実行結果は以下のようになります。

名前: John
年齢: 25

以上が、ポインタとアドレスの応用例についての説明です。

1 2 3
目次から探す