目次から探す
ポインタとアドレスの応用例
配列とポインタの関係
配列とポインタは密接な関係があります。
実際、配列名は、その配列の先頭要素へのポインタとして解釈されます。
以下に、配列とポインタの関係を示すサンプルコードを示します。
#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
以上が、ポインタとアドレスの応用例についての説明です。