N進数・文字列・数値変換プログラムの演習中。 座学も並行して進めたいので、今日は前半にポインタの説明を行う。
ポインタ演算の例として、以下のような処理を示す。
(( 基本 )) int x = 123 , y = 234 ; int *p ; p = &x ; *p = 111 ; // xに111が入る p = &y ; *p = 222 ; // yに222が入る (( ポインタとオフセット )) int a[] = { 11 , 22 , 33 , 44 } ; p = &a[1] ; printf( "%d" , *(p + 2) ) ; // 44 printf( "%d" , *(p - 1) ) ; // 11 p++ ; printf( "%d" , *p ) ; // 33 (( ポインタ渡し )) void foo( int *p ) { (*p)++ ; } void main() { int a = 11 ; foo( &a ) ; printf( "%d" , a ) ; // 12 foo( &a ) ; printf( "%d" , a ) ; // 13 } (( ポインタ移動の繰り返し )) int a[] = { 11 , 22 , 33 , -1 } ; int b[] = { 1 , 2 , 3 , 4 , 5 , 6 , -1 } ; int sum1( int array[] ) { // 基本 int s = 0 ; i ; for( i = 0 ; array[ i ] >= 0 ; i++ ) s += array[ i ] ; return s ; } int sum2( int* p ) { // ポインタ移動 int s = 0 ; for( ; *p >= 0 ; p++ ) s += *p ; return s ; } int sum3( int* p ) { // 移動と加算を1行で int s = 0 ; while( *p >= 0 ) s += *p++ ; return s ; } void main() { printf( "%d" , sum1( a ) ) ; printf( "%d" , sum2( b ) ) ; printf( "%d" , sum3( a ) ) ; }
来週は、ポインタと配列が同じ扱いであることを改めて説明し、 2進数の取り扱う bit 演算を説明する予定。