C言語でポインタの使い方を学べるサンプルプログラムを作成する
ポインタとは、別の変数のアドレス(メモリ上の場所)を格納するための変数のことです。C言語においてポインタは非常に重要な概念であり、メモリを直接操作することで効率的なプログラミングを可能にします。
ポインタの特徴
ポインタを使うことでメモリ空間を節約できます。
メモリ上の場所へ直接アクセスできるため、実行速度が速くなります。
ポインタを利用すると、メモリへのアクセスが効率化され、動的なメモリの割り当て(確保)と解放が可能になります。
連結リストや木構造などのデータ構造でもポインタが広く使われています。
ポインタの宣言
int *p;
これは「p」がポインタ変数であり、別の整数型変数のアドレスを保持することを意味します。
ポインタの初期化
ポインタ変数を初期化するには、アドレス演算子(&)を使用します。
例:
int qty = 175; int *p; p = &qty;
この例では、変数qtyのアドレスがポインタpに代入され、pはqtyを指し示すことになります。
ポインタ経由で変数にアクセスする
ポインタが指し示す先の変数の値にアクセスするには、間接参照演算子(*)を使用します。
プログラム
#include<stdio.h>
void main(){
//変数とポインタの宣言//
int a=2;
int *p;
//変数とポインタの関連付け//
p=&a;
//結果の出力//
printf("Size of the integer is %d\n",sizeof (int));//4//
printf("Address of %d is %d\n",a,p);//アドレス値//
printf("Value of %d is %d\n",a,*p);//2//
printf("Value of next address location of %d is %d\n",a,*(p+1));//(p+1)番地から読み取った不定な値(ゴミ値)//
printf("Address of next address location of %d is %d\n",a,(p+1));//アドレス値+4//
//ポインタの型キャスト//
//char型の宣言と初期化//
//a=2 = 00000000 00000000 00000000 00000010//
char *p0;
p0=(char*)p;
//結果の出力//
printf("Size of the character is %d\n",sizeof(char));//1//
printf("Address of %d is %d\n",a,p0);//アドレス値(p)//
printf("Value of %d is %d\n",a,*p0);//変数aの値の第1バイト - 2//
printf("Value of next address location of %d is %d\n",a,*(p0+1));//変数aの値の第2バイト - 0//
printf("Address of next address location of %d is %d\n",a,(p0+1));//アドレス値(p)+1//
}
実行結果
Size of the integer is 4 Address of 2 is 6422028 Value of 2 is 2 Value of next address location of 2 is 10818512 Address of next address location of 2 is 6422032 Size of the character is 1 Address of 2 is 6422028 Value of 2 is 2 Value of next address location of 2 is 0 Address of next address location of 2 is 6422029
この出力から分かるように、int型ポインタの場合は次のアドレス位置が4バイト先(6422028→6422032)になりますが、char型にキャストしたポインタでは1バイト先(6422028→6422029)となります。これは、ポインタの加算が「指し示すデータ型のサイズ」単位で行われることを示しています。また、char型ポインタで1バイトずつ読み取ることで、int型の値2がリトルエンディアン方式でメモリ上に格納されている様子も確認できます。
-
C言語で配列を逆順に反転させるプログラムの書き方
配列とは、共通の名前のもとで管理される、関連性のあるデータ項目の集まりのことです。同じ型の複数の値を効率的に扱いたい場合に活用されます。配列の宣言構文C言語で配列を宣言する際の基本的な構文は以下のとおりです。データ型 配列名 [サイズ];配列の初期化配列は、宣言と同時に初期化することもできます。int a[5] = { 10,20,30,40,50};この例では、整数型の配列 a の5つの要素に、それぞれ10から50までの値が順番に格納されています。C言語で配列を逆順にする方法配列の要素を逆順に並べ替えるには、要素の入れ替え(スワップ)やコピーのテクニックを利用します。たとえば、4つの要素を持
-
C言語でPGM形式の画像ファイルを書き出す方法
PGM形式とはPGM(Portable Gray Map:ポータブルグレイマップ)は、グレースケール画像を扱うためのシンプルな画像フォーマットです。C言語で保持している2次元配列をPNGやJPEGなどの一般的な画像形式として保存するには、データを所定のフォーマットにエンコードするための複雑な処理を大量に実装する必要があります。そこで役立つのがNetpbm形式です。Netpbmはオープンソースのグラフィックスプログラム群で、主にLinuxやUnixプラットフォームで利用されていますが、Microsoft Windows環境でも動作します。この形式を利用すれば、2次元配列のデータを簡単かつ移植性の