ホーム » 2012 » 5月 » 16

日別アーカイブ: 2012年5月16日

2012年5月
« 4月   6月 »
 12345
6789101112
13141516171819
20212223242526
2728293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

ポインタ処理と演習

前回の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以外