ホーム » 2013 » 5月 » 21

日別アーカイブ: 2013年5月21日

2013年5月
« 4月   6月 »
 1234
567891011
12131415161718
19202122232425
262728293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

ポインタ処理

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 演算を説明する予定。