Thinkers'Studio
JavaとC言語の自習ツール
配列とポインタのプログラムクイズ(3)

 今回は、ポインタ演算で大事なことをプログラムを使って確認し、そのあとクイズを出題します。

ポインタが配列の操作でよく利用されるのは

  ・ポインタの値をひとつ進めると、ポインタが指すデータ型ひとつ分のサイズを足したアドレスとなるからです。
  ・それは、配列では次の要素を指し示すことになります。

 次のプログラムを実行してみると、よく分かります。
 charへのポインタ、intへのポインタ、doubleへのポインタを ++ しながら、配列要素を参照し、アドレスをプリントします。
 ポインタの値がどのように増加するかを見ることができます。

#include <stdio.h>
main()
{
    int i;
    //配列の宣言と初期化
    char str[] = "Snoopy";
    int nlst[] = { 100, 200, 300, 400, 500 };
    double dlst[] = { 1.1, 1.2, 1.3, 1.4, 1.5 };
    //ポインタの宣言
    char *cp;
    int *np;
    double *dp;

    //ポインタが指すデータ型のサイズを出力
    //forループでポインタが指す値とその時点のアドレスを出力
    printf( "charのサイズ %d\n", sizeof(char) );
    for( cp = str, i = 0; *cp != '\0'; cp++, i++ ) {
        printf( "str[%d]:%c, cpの値:%p\n", i, *cp, cp );
    }
    np = nlst;
    printf( "intのサイズ %d\n", sizeof(int) );
    for( i = 0; i < 5; i++ ) {
        printf( "nlst[%d]:%d, npの値:%p\n", i, *np, np );
        np++;
    }
    dp = dlst;
    printf( "doubleのサイズ %d\n", sizeof(double) );
    for( i = 0; i < 5; i++ ) {
        printf( "dlst[%d]:%.1f, dpの値:%p\n", i, *dp, dp );
        dp++;
    }
}
(ある環境での実行結果例)
charのサイズ 1
str[0]:S, cpの値:0xbfe32740
str[1]:n, cpの値:0xbfe32741
str[2]:o, cpの値:0xbfe32742
str[3]:o, cpの値:0xbfe32743
str[4]:p, cpの値:0xbfe32744
str[5]:y, cpの値:0xbfe32745    ・・・ cpの値は1byteずつ増加
intのサイズ 4
nlst[0]:100, npの値:0xbfe32720
nlst[1]:200, npの値:0xbfe32724
nlst[2]:300, npの値:0xbfe32728
nlst[3]:400, npの値:0xbfe3272c
nlst[4]:500, npの値:0xbfe32730 ・・・ npの値は4byteずつ増加
doubleのサイズ 8
dlst[0]:1.1, dpの値:0xbfe326f0
dlst[1]:1.2, dpの値:0xbfe326f8
dlst[2]:1.3, dpの値:0xbfe32700
dlst[3]:1.4, dpの値:0xbfe32708
dlst[4]:1.5, dpの値:0xbfe32710 ・・・ dpの値は8byteずつ増加

 ポインタを ++ すると、ポインタが指すデータ型のサイズ分だけ、アドレスの値が増加していくことが分かります。
  ポインタが指すデータ型のサイズ --- sizeof演算子を使って求めました
  アドレス --- %p の変換書式でポインタの値を表示しました

(では、今回のクイズです)
 上のプログラムで、
  (1) np = nlst + 3; で、np は nlst[3] を指すようになる。これは正しいですか?
  (2) *(str+i) は、str[i] と同じことである。これは正しいですか?
  (3) cp = str+strlen(str)-1; と代入したあと、*cp をプリントすると何が出力されますか?
 上記で確認したことや「配列名だけを書くと配列の先頭アドレスを示すこと」 を使えば簡単ですね。
   (答えは、次回のC言語の Tips で ・・・)

[ 関連記事 ] 用語集:ポインタ, Tips:ポインタの間違い探し, 配列とポインタのクイズ(1), 同(2), NULLポインタ
[ ご案内 ] ポインタの要点を学習できるコース:要点講座 [配列とポインタ編]

前回のクイズの答え: (前回の問題を見る
(3) の O(N2)
バブルソートの処理速度は、データの要素数の2乗にほぼ比例します。