今回は、ポインタ演算で大事なことをプログラムを使って確認し、そのあとクイズを出題します。
・ポインタの値をひとつ進めると、ポインタが指すデータ型ひとつ分のサイズを足したアドレスとなるからです。
・それは、配列では次の要素を指し示すことになります。
次のプログラムを実行してみると、よく分かります。
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 の変換書式でポインタの値を表示しました
[ 関連記事 ] 用語集:ポインタ, Tips:ポインタの間違い探し,
配列とポインタのクイズ(1),
同(2), NULLポインタ
[ ご案内 ] ポインタの要点を学習できるコース:要点講座 [配列とポインタ編]