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

C言語入門:ポインタと2次元配列の仕組みをわかりやすく解説

ポインタとは、別の変数のアドレス(メモリ上の場所)を格納するための特殊な変数です。C言語において、ポインタはメモリを直接操作できる強力な機能として、効率的なプログラミングに欠かせない存在となっています。

ポインタの主な特徴

  • ポインタを使うことで、メモリ領域を節約できます。

  • メモリ上の位置へ直接アクセスできるため、実行速度が速くなります。

  • ポインタを利用すると、メモリの動的な割り当てと解放が可能になり、メモリを効率的に管理できます。

  • リンクリストやツリーなどのデータ構造と組み合わせて使われます。

ポインタと2次元配列の関係

2次元配列は、メモリ上には行ごとに連続した形で配置されます。例えば、次のように3×3の2次元配列を宣言した場合のメモリ割り当てを見てみましょう。

int a[3][3] = {1,2,3,4,5,6,7,8,9};

C言語入門:ポインタと2次元配列の仕組みをわかりやすく解説

C言語入門:ポインタと2次元配列の仕組みをわかりやすく解説

配列の先頭アドレスが1234番地である場合、a[1][2] のアドレスは次のように計算されます。

a[1][2] = *(1234 + 1*3 + 2)
        = *(1234 + 3 + 2)
        = *(1234 + 5*4)  // 4 はスケール係数(int型のサイズ)
        = *(1234 + 20)
        = *(1254)
a[1][2] = 6

このように、ポインタ演算では「行インデックス × 列数 + 列インデックス」でオフセットを求め、さらにそれに型のサイズ(ここではint型なので4バイト)を掛けることで、実際のメモリアドレスが算出されます。

サンプルプログラム

以下は、ポインタを使って2次元配列の要素を読み書きするCプログラムの例です。

#include<stdio.h>
main(){
    int a[3][3], i, j;
    int *p;
    clrscr();
    printf("Enter elements of 2D array");
    for(i=0; i<3; i++){
        for(j=0; j<3; j++){
            scanf("%d", &a[i][j]);
        }
    }
    p = &a[0][0];
    printf("elements of 2d array are");
    for(i=0; i<3; i++){
        for(j=0; j<3; j++){
            printf("%d \t", *(p+i*3+j));
        }
        printf("\n");
    }
    getch();
}

このプログラムのポイントは、p = &a[0][0]; で配列の先頭要素のアドレスをポインタ p に代入し、*(p + i*3 + j) という式で任意の要素 a[i][j] にアクセスしている点です。行のサイズ(列数)を掛けて行オフセットを求め、列オフセットを加算することで、連続的に並んだメモリ上の目的の要素位置を特定できます。

実行結果

上記のプログラムを実行すると、次のような出力が得られます。

enter elements of 2D array
1 2 3 4 5 6 7 8 9
Elements of 2D array are
1 2 3
4 5 6
7 8 9

  1. C言語のポインタ配列とは?宣言・初期化・アクセス方法を実例付きで解説

    ポインタとは、別の変数のアドレス(メモリ上の場所)を格納するための変数です。C言語においてポインタは非常に重要な概念であり、メモリを直接操作することで効率的なプログラムを作成できます。 ポインタの特徴 メモリ空間を節約できる メモリ位置へ直接アクセスするため、実行速度が速い メモリを効率的に利用でき、動的な割り当て(確保)と解放が可能 リンクリストやツリーなどのデータ構造と組み合わせて使用できる ポインタの宣言と初期化 まず、次のような文を考えてみましょう。 int qty = 179; このとき、変数はメモリ上に値「179」とそのアドレスを持つ形で表現されます。 ポインタの宣言 ポ

  2. C言語入門:モノリシックプログラミングとモジュラープログラミングの違いを徹底解説

    本記事では、C言語におけるモノリシックプログラミングとモジュラープログラミングの違いを、それぞれのメリット・デメリットとともに詳しく解説します。 モノリシックプログラミングとは プログラム全体を1つの関数、すなわちmain関数だけですべて記述する方式を「モノリシック(一枚岩)型プログラミング」と呼びます。しかし、すべてのロジックを単一の関数に詰め込むのは、良いプログラミングスタイルとは言えません。 デメリット モノリシックプログラミングには、以下のような欠点があります。 プログラムが非常に大きく、複雑になりやすい。 デバッグ、テスト、保守が非常に困難になる。 モジュラープログラミングとは