関数の記憶クラス

・関数に指定できるクラスはstaticとexternのいずれかである。
・static記憶クラスを持つ関数は、その関数が定義されているファイル内の関数からのみ呼び出す事ができる。
 他のファイルの関数からstatic関数を呼び出すことはできない。
・extern記憶クラスを持つ関数は、他のファイルの関数から呼び出す事ができる。
 関数の記憶クラスを省略した場合はexternが暗黙的に採用される。
・特定のファイル内の、特定の処理に特化した独立性の低い関数の場合は、名前の競合を避ける為にstatic記憶クラスを指定する事が推奨される。
C > 関数 | comments (0) | trackbacks (0)

関数のポインタ配列

構文
戻り値型 (*識別子)(パラメータ型リスト)


#include <stdio.h>

int func1( int, int );
int func2( int, int );

void main()
{
 int ( *funcp[] )( int, int ) = { func1, func2 };
 printf( "%d\n", funcp[0]( 1, 2 ) );
 printf( "%d\n", funcp[1]( 1, 2 ) );
}

int func1( int i, int j )
{
 return i + j;
}

int func2( int i, int j )
{
 return i - j;
}


実行結果

3
-1

C > 関数 | comments (0) | trackbacks (0)

関数の再帰呼び出し


#include <stdio.h>

int loopA( int );
void loopB( int );

void main()
{
 int i = 3;
 loopA( i );
 printf( "\n" );
 loopB( i );
}

int loopA( int n )
{
 printf( "loopA-out1:%d\n", n );
 if ( !n ) {
  printf( "出力終了\n" );
  return 0;
 }
 return loopA( --n );
 printf( "loopA-out2:%d\n", n );
}

void loopB( int n )
{
 printf( "loopB-out1:%d\n", n );
 if ( !n ) {
  printf( "出力終了\n" );
  return;
 }
 loopB( --n );
 printf( "loopB-out2:%d\n", n );
}


出力結果

loopA-out1:3
loopA-out1:2
loopA-out1:1
loopA-out1:0
出力終了

loopB-out1:3
loopB-out1:2
loopB-out1:1
loopB-out1:0
出力終了
loopB-out2:0
loopB-out2:1
loopB-out2:2

C > 関数 | comments (0) | trackbacks (0)

ポインタ配列を関数に渡す


#include <stdio.h>

void dispA( char** s )
{
 int i = 0;
 printf( "sのアドレス%p:格納アドレス%p\n", &s, s );
 while ( s[ i ] != NULL ) {
  printf( "s[%d]のアドレス%p:格納アドレス%p:%s\n", i, &s[ i ], s[ i ], s[ i ] );
  i++;
 }
 printf( "sのアドレス%p:格納アドレス%p\n\n", &s, s );
}

void dispB( char** s )
{
 printf( "sのアドレス%p:格納アドレス%p\n", &s, s );
 while ( *s != NULL ) {
  printf( "sのアドレス%p:格納アドレス%p:%s\n", &s, *s, *s );
  s++;
 }
 printf( "sのアドレス%p:格納アドレス%p\n", &s, s );
}

void main()
{
 char *name[] = { "Candy", "Rolla", "Nancy", "Ann", "Eluza", NULL };
 dispA( name );
 dispB( name );
}


実行結果

sのアドレス0012FF18:sの格納アドレス0012FF68
s[0]のアドレス0012FF68:s[0]の格納アドレス0042201C:Candy
s[1]のアドレス0012FF6C:s[1]の格納アドレス00423030:Rolla
s[2]のアドレス0012FF70:s[2]の格納アドレス00422FBC:Nancy
s[3]のアドレス0012FF74:s[3]の格納アドレス00422FB4:Ann
s[4]のアドレス0012FF78:s[4]の格納アドレス00422FAC:Eluza
sのアドレス0012FF18:sの格納アドレス0012FF68

sのアドレス0012FF18:sの格納アドレス0012FF68
sのアドレス0012FF18:sの格納アドレス0042201C:Candy
sのアドレス0012FF18:sの格納アドレス00423030:Rolla
sのアドレス0012FF18:sの格納アドレス00422FBC:Nancy
sのアドレス0012FF18:sの格納アドレス00422FB4:Ann
sのアドレス0012FF18:sの格納アドレス00422FAC:Eluza
sのアドレス0012FF18:sの格納アドレス0012FF7C

C > 関数 | comments (0) | trackbacks (0)

2次元配列を関数に渡す


#include <stdio.h>

int sum( int* a )
{
 int i = 0, sum = 0;
 while ( *a != -999 ) {
  sum += *a;
  a++;
 }
 return sum;
}

void main()
{
 int a[][4] = { { 1, 2, 3, 0 }
        , { 4, 5, 6, 0 }
        , { 7, 8, 9, -999 } };

 printf( "%d\n", sum( a[0] ) );
}

C > 関数 | comments (0) | trackbacks (0)

1次元配列を関数に渡す


#include <stdio.h>

int sumA( int* a )
{
 int sum = 0;
 while ( *a != -999 ) {
  sum += *a;
  a++;
 }
 return sum;
}

int sumB( int* a )
{
 int i = 0, sum = 0;
 while ( a[ i ] != -999 ) {
  sum += a[ i ];
  i++;
 }
 return sum;
}

void main()
{
 int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -999 };

 printf( "%d\n", sumA( a ) );
 printf( "%d\n", sumB( a ) );
}

C > 関数 | comments (0) | trackbacks (0)