プログラミング

【初心者向け】C言語のポインタを使った配列の使い方

プログラミング

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);
}

このプログラムは、次の処理をしています。

  1. int型のポインタで10個の配列を作る。
    ip=(int *)malloc(sizeof(int) * N);
    malloc関数でメモリ確保をしています。malloc関数の戻り値はvoid *なので、int *でキャスト(int *に変更する)しています。引数は配列の数を指定しています(sizeof関数でint型のサイズを算出して、変数Nで配列の数量を指定)。
  2. 上記の配列に0~9の実数を代入する
  3. 代入結果を表示する
  4. メモリの解放をする
    free(ip);
  5. (おまけ)配列のメモリ番地(アドレス)を表示

実行結果は以下です。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

C言語を体系的に学びたいのであれば、この本なんかいいかもしれませんね。

スッキリわかるC言語入門 [ 中山清喬 ]

価格:2,970円
(2021/3/8 12:37時点)

苦しんで覚えるC言語 [ MMGames ]

価格:2,420円
(2021/3/8 12:38時点)

おまけ: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

こちらは、double型のサイズ8byteごとにメモリ確保されていることがわかりますね。

参考までに私のC言語の勉強環境は以下のページを見てみてください。環境構築できるとおもいますので。

それでは。

スポンサーリンク
シェアする
ゼットマンをフォローする
ゼットマンブログ

コメント

タイトルとURLをコピーしました