前回のN進数変換のプログラム演習で、 まだまだ完成していない人が多いようなので、前半で説明・後半を演習とした。
ポインタ演算の説明として、以下のような例をしめす。 関数とのポインタ渡しなどは説明済み。
int a[ 4 ] = { 11 , 22 , 33 , 44 } ; int*p = a ; printf( "%d" , *p + 1 ) ; // 11 + 1 = 12 printf( "%d" , *(p + 1) ) ; // ひとつ後ろの場所22 p += 2 ; printf( "%d" , *p ) ; // 参照場所を2つ後ろに移動33 printf( "%d %d" , *(p + 1) , p[ 1 ] ) ; // 44,44 ポインタ記述 printf( "%d %d" , *(p - 1) , p[ -1 ] ) ; // 22,22 と配列記述
また、ポインタを動かしながら参照などの理解をするために、 前置インクリメント、後置インクリメントの違いを説明。
// ポストインクリメント int x = 1 ; printf( "%d" , x++ ) ; // printfの後に増やす。 printf( "%d" , x++ ) ; // 1 2 を表示 // プレインクリメント int x = 1 ; printf( "%d" , ++x ) ; // printfの前に増やす。 printf( "%d" , ++x ) ; // 2 3 を表示
以上のネタが解かった所で、配列加算とstrcpyの例を示す。
// 配列で0までの数値を加算する int a[ 4 ] = { 12 , 23 , 34 , 0 } ; int s = 0 ; for( i = 0 ; a[i] != 0 ; i++ ) s += a[i] ; // forの部分をポインタ移動に書き換え int *p = a ; while( *p != 0 ) s += *p++ ;
C言語の標準関数のstrcpyの中身を色々な書き方で示す。返り値はひとまずvoidにて… これにより、ポインタの移動処理と、条件判定が0/0以外であることを説明する。
void strcpy( char*t , char*s ) { for( int i = 0 ; s[i] != '¥0' ; i++ ) t[i] = s[i] ; } // forの部分を次々と書き変える for( ; *s != '¥0' ; s++ , t++ ) // コンマ演算子にも注意 *t = *s ; while( *s != '¥0' ) // ポストインクリメントを使って *t++ = *s++ ; while( (*t++ = *s++) != '¥0' ) ; // 条件内で代入 while( *t++ = *s++ ) ; // 偽=0,真=0以外