C言語入門(11) ポインターって何が難しくて、みんな苦しんでいるのか

Posted: 2012年07月02日

ポインターは難しいとよく聞きますし、
私自身もポインターを理解しているかいないかで、良いプログラムが書けるかの差になってくると思っています。
理解すればCプログラマーの土台ができたと言っても過言ではありません。

まずポインターとは何か

コンピュータのシステムで説明すると「ショットカットファイル」です。
1MbyteのWordファイルが存在するとします。
コピーしてそのファイルを編集した場合、変更されるファイルは、コピーしたファイルで
コピー元は変更されません。
また、1Mbyte ☓ 2の記憶容量が使用されます。
しかし、コピーではなくショットカットファイルを作成した場合
変更されるファイルは、ショットカットファイルが指し示すファイルです。
また、1Mbyte + 数Kbyteの記憶容量が使用されます。

コピー ショートカット
データサイズ 元のデータ☓コピー数 元のデータ+ショットカットファイルサイズ☓ショットカットファイル数
編集 元のデータは変更されない 元のデータは変更される
処理時間 元データのサイズが大きくなるほど時間がかかる 元のデータのサイズは関係なく作成できる

状況によって普段使い分けていると思います。

これをコピーは元データと同様の変数、ショートカットは、ポインター変数に置き換えて考えてみましょう

同様の変数 ポインター変数
データサイズ 元のデータ☓コピー数 元のデータ+4byte(32bit環境)
編集 元のデータは変更されない 元のデータは変更される
処理時間 元データのサイズが大きくなるほど時間がかかる 元のデータのサイズは関係なく作成できる

具体的には

プログラムプログラム:

 long aryBigArray[1024 * 64]; // 64Kb ☓ 8byte
 long aryCopyArray[1024 * 64]; // 64Kb ☓ 8byte
 long *pPointerArray; // 4byte

 // 配列のコピー
 memcpy(aryBigArray, aryCopyArray, sizepf(aryBigArray));

 // ポインターのコピー
 pPointerArray = aryBigArray;

解説解説:

aryBigArray、aryCopyArrayは配列を宣言しています。
pPointerArrayは*をつけているためポインター変数を宣言しています。
memcpyを使用することで配列の中身をコピーすることができます。
ポインターの場合は、変数の位置を代入するだけのため
代入のみを行います。

ポインターを使用して問題となる点は、
ショートカットと同様にポインターは変更ができてしまうため、不都合がある場合は、
一度コピーを行い(変数に代入)それをショートカット(ポインター変数)で使いまわすことで
変更されても、元のデータに影響はありません。
プログラムの場合は、無事に本当にコピー(代入)がされたかを確認し忘れると
実は一部はショートカット(ポインター変数)でしたという事があるため
テストするポイントであります!!

ポインターの触り程度で今回は終わりにします。

練習練習:

  1. 以下のプログラムが実行された時に出力される文字を考えてください。
 int main(void)
 {
    // 変数宣言
    int nResult = 0;
    int *pNumber = &nResult;

    nResult = 5;
    printf("%d", *pNumber);

    return nResult;
 }
カテゴリー: プログラム, 入門 | タグ: , | コメント無し »

コメント