【C言語】ポインタ変数を使ってみる

目次から探す

ポインタ変数の応用

配列とポインタ変数の関係

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

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

例えば、以下のような配列があるとします。

int numbers[5] = {1, 2, 3, 4, 5};

この場合、numbersは配列の先頭要素である1へのポインタとして解釈されます。

つまり、numbers&numbers[0]と同じ意味になります。

ポインタ変数を使って配列の要素にアクセスするには、以下のようにします。

int *ptr = numbers;  // ポインタ変数に配列の先頭要素へのポインタを代入
printf("%d\n", *ptr);  // ポインタ変数を使って配列の先頭要素にアクセス
printf("%d\n", *(ptr + 1));  // ポインタ変数を使って配列の2番目の要素にアクセス

上記の例では、ptrというポインタ変数にnumbersの先頭要素へのポインタを代入しています。

そして、*ptrを使ってnumbersの先頭要素にアクセスしています。

また、*(ptr + 1)を使ってnumbersの2番目の要素にアクセスしています。

関数とポインタ変数の関係

関数とポインタ変数も密接な関係があります。

関数の引数としてポインタ変数を使うことで、関数内で変数の値を変更することができます。

以下の例を見てみましょう。

void increment(int *num) {
    (*num)++;
}
int main() {
    int number = 5;
    increment(&number);  // ポインタ変数を使って関数に変数のアドレスを渡す
    printf("%d\n", number);  // 6が出力される
    return 0;
}

上記の例では、incrementという関数を定義しています。

この関数は、引数としてポインタ変数numを受け取り、その値をインクリメントします。

main関数内でnumberという変数を定義し、increment関数&numberというポインタ変数を渡しています。

すると、increment関数内でnumの値がインクリメントされ、main関数内のnumberの値も変更されます。

動的メモリの確保と解放

動的メモリの確保と解放もポインタ変数を使った応用の一つです。

動的メモリの確保には、malloc関数を使います。

以下の例を見てみましょう。

int *numbers = malloc(5 * sizeof(int));  // int型の要素を5つ分のメモリを確保
if (numbers == NULL) {
    printf("メモリの確保に失敗しました\n");
    return 1;
}
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
numbers[3] = 4;
numbers[4] = 5;
for (int i = 0; i < 5; i++) {
    printf("%d\n", numbers[i]);
}
free(numbers);  // メモリの解放

上記の例では、malloc関数を使ってint型の要素を5つ分のメモリを確保しています。

確保したメモリの先頭アドレスをnumbersというポインタ変数に代入しています。

そして、numbersを使って配列のように要素にアクセスし、値を代入しています。

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

動的メモリの確保と解放は、必要な時に必要なだけメモリを確保できるという利点がありますが、確保したメモリを解放しないとメモリリークが発生する可能性があるため、注意が必要です。

以上がポインタ変数の応用についての説明です。

ポインタ変数を使った配列や関数、動的メモリの操作は、C言語プログラミングにおいて非常に重要な概念ですので、しっかりと理解しておきましょう。

1 2 3
目次から探す