C言語入門:ポインタと2次元配列の仕組みをわかりやすく解説
ポインタとは、別の変数のアドレス(メモリ上の場所)を格納するための特殊な変数です。C言語において、ポインタはメモリを直接操作できる強力な機能として、効率的なプログラミングに欠かせない存在となっています。
ポインタの主な特徴
ポインタを使うことで、メモリ領域を節約できます。
メモリ上の位置へ直接アクセスできるため、実行速度が速くなります。
ポインタを利用すると、メモリの動的な割り当てと解放が可能になり、メモリを効率的に管理できます。
リンクリストやツリーなどのデータ構造と組み合わせて使われます。
ポインタと2次元配列の関係
2次元配列は、メモリ上には行ごとに連続した形で配置されます。例えば、次のように3×3の2次元配列を宣言した場合のメモリ割り当てを見てみましょう。
int a[3][3] = {1,2,3,4,5,6,7,8,9};


配列の先頭アドレスが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
-
C言語のポインタ配列とは?宣言・初期化・アクセス方法を実例付きで解説
ポインタとは、別の変数のアドレス(メモリ上の場所)を格納するための変数です。C言語においてポインタは非常に重要な概念であり、メモリを直接操作することで効率的なプログラムを作成できます。 ポインタの特徴 メモリ空間を節約できる メモリ位置へ直接アクセスするため、実行速度が速い メモリを効率的に利用でき、動的な割り当て(確保)と解放が可能 リンクリストやツリーなどのデータ構造と組み合わせて使用できる ポインタの宣言と初期化 まず、次のような文を考えてみましょう。 int qty = 179; このとき、変数はメモリ上に値「179」とそのアドレスを持つ形で表現されます。 ポインタの宣言 ポ
-
C言語入門:モノリシックプログラミングとモジュラープログラミングの違いを徹底解説
本記事では、C言語におけるモノリシックプログラミングとモジュラープログラミングの違いを、それぞれのメリット・デメリットとともに詳しく解説します。 モノリシックプログラミングとは プログラム全体を1つの関数、すなわちmain関数だけですべて記述する方式を「モノリシック(一枚岩)型プログラミング」と呼びます。しかし、すべてのロジックを単一の関数に詰め込むのは、良いプログラミングスタイルとは言えません。 デメリット モノリシックプログラミングには、以下のような欠点があります。 プログラムが非常に大きく、複雑になりやすい。 デバッグ、テスト、保守が非常に困難になる。 モジュラープログラミングとは