C言語でポインタを使った配列の使い方について、ざっくり説明します。
ポインタを使って配列を作るにはメモリの確保/解放をすることを覚えておくと良いです。メモリ確保する理由は、プログラムが開始したた段階ではメモリ確保していないから。メモリ解放する理由は、プログラムが終了しても確保した領域がゴミとして残るからです(メモリリーク)。解放は特に重要なので忘れないようにした方がいいですね。
処理に必要なサイズをその都度(動的に)確保するには”malloc関数“を使います。解放するには”free関数”を使います。以下に簡単なソースコードを載せます。
メモリ確保/解放のサンプルソースコード
#include <stdio.h>
#include <stdlib.h>
#define N 10
int main(void)
{
int *ip, i;
// メモリの動的確保
ip=(int *)malloc(sizeof(int) * N);
// 値の代入
for(i=0;i<N;i++)
{
ip[i]=i;
}
// 表示
for(i=0;i<N;i++)
{
printf("%d ", ip[i]);
}
printf("\n");
printf("\n");
// メモリ番地の表示
printf("size of int:%d\n",sizeof(int));
for(i=0;i<N;i++)
{
printf("[%d]:0x%x\n",i,&ip[i]);
}
// メモリの解放
free(ip);
}
このプログラムは、次の処理をしています。
- int型のポインタで10個の配列を作る。ip=(int *)malloc(sizeof(int) * N);malloc関数でメモリ確保をしています。malloc関数の戻り値はvoid *なので、int *でキャスト(int *に変更する)しています。引数は配列の数を指定しています(sizeof関数でint型のサイズを算出して、変数Nで配列の数量を指定)。
- 上記の配列に0~9の実数を代入する
- 代入結果を表示する
- メモリの解放をするfree(ip);
- (おまけ)配列のメモリ番地(アドレス)を表示
実行結果は以下です。int型のメモリが10個確保されていることがわかります。また、メモリ番地(アドレス)を見るとint型のサイズの4byteごとにメモリを確保出来ていることが確認できますね。表記は16進数です。
[testuser@localhost C]$ ./a.out
0 1 2 3 4 5 6 7 8 9
size of int:4
[0]:0x16f02a0
[1]:0x16f02a4
[2]:0x16f02a8
[3]:0x16f02ac
[4]:0x16f02b0
[5]:0x16f02b4
[6]:0x16f02b8
[7]:0x16f02bc
[8]:0x16f02c0
[9]:0x16f02c4
0 1 2 3 4 5 6 7 8 9
size of int:4
[0]:0x16f02a0
[1]:0x16f02a4
[2]:0x16f02a8
[3]:0x16f02ac
[4]:0x16f02b0
[5]:0x16f02b4
[6]:0x16f02b8
[7]:0x16f02bc
[8]:0x16f02c0
[9]:0x16f02c4
C言語を体系的に学びたいのであれば、この本なんかいいかもしれませんね。
![]() | 価格:2,970円 |

![]() |
価格:2,420円 |

おまけ:double型の場合
このソースコードをdouble型にした場合、結果は次の通りです。
[testuser@localhost C]$ ./a.out
0.000000 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000 9.000000
size of double:8
[0]:0x81f2a0
[1]:0x81f2a8
[2]:0x81f2b0
[3]:0x81f2b8
[4]:0x81f2c0
[5]:0x81f2c8
[6]:0x81f2d0
[7]:0x81f2d8
[8]:0x81f2e0
[9]:0x81f2e8
0.000000 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000 9.000000
size of double:8
[0]:0x81f2a0
[1]:0x81f2a8
[2]:0x81f2b0
[3]:0x81f2b8
[4]:0x81f2c0
[5]:0x81f2c8
[6]:0x81f2d0
[7]:0x81f2d8
[8]:0x81f2e0
[9]:0x81f2e8
こちらは、double型のサイズ8byteごとにメモリ確保されていることがわかりますね。
参考までに私のC言語の勉強環境は以下のページを見てみてください。環境構築できるとおもいますので。
それでは。
コメント