Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C/C++におけるポインタの活用例をわかりやすく解説

ポインタはC言語およびC++において最も重要な概念の一つです。単に変数のアドレスを扱うだけでなく、配列操作・動的メモリ確保・関数への参照渡しなど、さまざまな場面で活躍します。本記事では、ポインタの代表的な応用例をCとC++のコード例とともに紹介します。

1. 配列要素へのアクセス

配列名は先頭要素のアドレスを表すため、ポインタ演算を使って配列の各要素にアクセスできます。*(a + i)a[i] と同じ意味になります。

C言語の場合

#include <stdio.h>
int main() {
    int a[] = { 60, 70, 20, 40 };
    printf("%d\n", *(a + 1));
    return 0;
}

出力結果:

70

C++の場合

#include <iostream>
using namespace std;
int main() {
    int a[] = { 60, 70, 20, 40 };
    cout << *(a + 1);
    return 0;
}

出力結果:

70

2. 動的メモリ確保

プログラムの実行時に必要なサイズのメモリを確保したい場合、ポインタを使って動的にメモリを割り当てることができます。C言語では malloc() を使用し、使い終わったら free() で解放するのが基本です。

C言語の場合

#include <stdio.h>
#include <stdlib.h>
int main() {
    int i, *ptr;
    ptr = (int*) malloc(3 * sizeof(int));
    if(ptr == NULL) {
        printf("Error! memory not allocated.");
        exit(0);
    }
    *(ptr+0) = 1;
    *(ptr+1) = 2;
    *(ptr+2) = 3;
    printf("Elements are:");
    for(i = 0; i < 3; i++) {
        printf("%d ", *(ptr + i));
    }
    free(ptr);
    return 0;
}

出力結果:

Elements are:1 2 3

C++の場合

C++では new / delete 演算子を使うのが一般的ですが、ここではC言語と同様に malloc() を使った例を示します。

#include <iostream>
#include <stdlib.h>
using namespace std;
int main() {
    int i, *ptr;
    ptr = (int*) malloc(3 * sizeof(int));
    if(ptr == NULL) {
        cout << "Error! memory not allocated.";
        exit(0);
    }
    *(ptr+0) = 1;
    *(ptr+1) = 2;
    *(ptr+2) = 3;
    cout << "Elements are:";
    for(i = 0; i < 3; i++) {
        cout << *(ptr + i);
    }
    free(ptr);
    return 0;
}

出力結果:

Elements are:1 2 3

3. 関数への参照渡し(引数としてのポインタ)

ポインタを使えば、関数に引数を参照渡しできます。値渡しでは元の変数は変更されませんが、ポインタ経由であれば関数内で呼び出し元の変数を直接書き換えられます。大きなデータをコピーせずに渡せるため、処理効率の向上にもつながります。

C言語の場合:swap関数の例

#include <stdio.h>
void swap(int* a, int* b) {
    int t = *a;
    *a = *b;
    *b = t;
}
int main() {
    int m = 7, n = 6;
    swap(&m, &n);
    printf("%d %d\n", m, n);
    return 0;
}

出力結果:

6 7

C++の場合

#include <iostream>
using namespace std;
void swap(int* a, int* b) {
    int t = *a;
    *a = *b;
    *b = t;
}
int main() {
    int m = 7, n = 6;
    swap(&m, &n);
    cout << m << " " << n;
    return 0;
}

出力結果:

6 7

4. データ構造の実装

連結リストや木構造などのデータ構造を実装する際にも、ポインタは欠かせません。ノードが次のノードへのアドレスを持つことで、柔軟で動的なデータ管理が可能になります。

まとめ

このように、ポインタは以下のような場面で幅広く活用されます。

  • 配列要素への効率的なアクセス
  • 実行時の動的メモリ確保
  • 関数への参照渡しによる効率化
  • 連結リスト・木構造などのデータ構造の実装

ポインタを正しく理解することは、C/C++プログラミングのスキルアップに直結します。まずは上記のサンプルコードを実際に動かして、挙動を確認してみてください。

  1. C/C++で文字列がint(整数)かどうかを判定する方法

    C/C++で文字列が整数(int)として妥当かどうかを判定する方法はいくつかあります。その中でも手軽なのが、標準ライブラリのisdigit()関数を使って文字列を1文字ずつチェックする方法です。ここでは、C++で文字列が整数を含んでいるかどうかを判定する具体例を紹介します。サンプルコード#include<iostream> #include<string.h> using namespace std; int main() { char str[] = "3257fg"; for (int i = 0; i < strlen

  2. C/C++の三項演算子(条件演算子)の基本と使い方

    3つのオペランド(被演算子)を必要とする演算子は「三項演算子」と呼ばれます。C言語では ? : の記号で表され、「条件演算子」とも呼ばれています。三項演算子を使うと、コードの行数を削減でき、簡潔で読みやすいプログラムを書くことができます。三項演算子の構文式1 ? 式2 : 式3まず式1が評価され、その結果が真(非ゼロ)であれば式2が実行され、偽(ゼロ)であれば式3が実行されます。if-else文を1行で書けるため、簡単な条件分岐に便利です。C言語での三項演算子の例サンプルコード1#include <stdio.h> int main() { int a = -1;