C言語 標準関数 | 応用 | サンプル

標準関数
構文
応用

管理人

プライバシーポリシー


構造体を参照するために引数として関数に渡す方法(参照渡し)

構造体を別関数で参照する場合は、通常の変数のように引数として指定すれば良い。

参照渡しなので引数にアンパサンド(&)を付ける必要はない。(関数内で値を更新しても実体データには影響しない)

構造体を別関数local_funcで参照する

#include <stdio.h>

/* 構造体の定義 */
typedef struct {
  char cdata[4];
  int idata;
strOutData;

/* ローカル関数 */
void local_func( strOutData str ) {

  printf( "str.cdata=%s\n" , str.cdata );
  printf( "str.idata=%d\n" , str.idata );

}

/* メイン関数 */
main() {

  strOutData str;

  /* データを設定 */
  strncpy( str.cdata , "abc" , sizeof( str.cdata ));
  str.idata = 123;

  /* 別の関数で参照 */
  local_func( str );
}

実行結果

str.cdata=abc
str.idata=123


構造体を更新するために引数として関数に渡す方法(アドレス渡し)

構造体を別関数で更新する場合は、通常の変数のように引数として指定すれば良い。

アドレス渡しなので引数にアンパサンド(&)を付ける必要がある。(関数内での値の更新は実体データの更新を意味する)

構造体を別関数local_funcで更新する

#include <stdio.h>

/* 構造体の定義 */
typedef struct {
  char cdata[4];
  int idata;
strOutData;

/* ローカル関数 */
void local_func( strOutData * str ) {

  strncpy( str->cdata , "xyz" , sizeof( str->cdata ));
  str->idata = 789;
}

/* メイン関数 */
main() {

  strOutData str;

  /* データを設定 */
  strncpy( str.cdata , "abc" , sizeof( str.cdata ));
  str.idata = 123;

  /* 別の関数で参照 */
  local_func( &str );

  /* 更新後の値を出力 */
  printf( "str.cdata=%s\n" , str.cdata );
  printf( "str.idata=%d\n" , str.idata );
}

実行結果

str.cdata=xyz
str.idata=789


構造体の配列を引数として関数に渡す方法(アドレス渡し):その1

構造体の配列を別関数local_funcへの引数とする場合は、アドレス渡しにしなければならず、参照渡しには出来ない。

配列のアドレス渡しなので引数にアンパサンド(&)を付ける必要はない。(値の更新は実体データの更新を意味する)

当たり前ではあるが、アドレス渡しなので参照のみを意図していても誤って更新しないように注意する必要がある。

以下のサンプルの関数local_funcでは、ポインタをインクリメントして構造体にアクセスしており、この手法は一般的に多用するので、ご存知ない方は覚えると便利でしょう。

構造体配列を別関数local_funcで参照または更新する

#include <stdio.h>

/* 構造体の定義 */
typedef struct {
  char cdata[4];
  int idata;
strOutData;

/* ローカル関数 */
void local_func( strOutData * str , int cnt ) {

  int i;
  strOutData * p;

  /* ポインタpのインクリメントに注意 */
  for( i=0 , p=str;i<cnt;i++ , p++ ) {
    strncpy( str->cdata , "xyz" , sizeof( str->cdata ));
    str->idata = 789;
  }
}

/* メイン関数 */
main() {

  int i , cnt;
  strOutData str[3];

  /* 配列数を求める */
  cnt = sizeof( str )/sizeof( strOutData );

  /* データを設定 */
  for( i=0;i<cnt;i++ ) {
    strncpy( str[i].cdata , "abc" , sizeof( str[i].cdata ));
    str[i].idata = 123;
  }

  /* 別の関数で更新 */
  local_func( str , cnt );

  /* 更新後の値を出力 */
  for( i=0;i<cnt;i++ ) {
    printf( "str[%d].cdata=%s\n" , i , str[i].cdata );
    printf( "str[%d].idata=%d\n" , i , str[i].idata );
  }
}

実行結果

str[0].cdata=xyz
str[0].idata=789
str[1].cdata=xyz
str[1].idata=789
str[2].cdata=xyz
str[2].idata=789


構造体の配列を引数として関数に渡す方法(アドレス渡し):その2

「構造体の配列を引数として関数に渡す方法(アドレス渡し):その1」ではポインタをインクリメントしていたが、このサンプルで示している[添字]を使っても同じ結果を得られる。

異なる箇所はlocal_func関数のみでmain関数は同じである。

その方法は、main関数での[ /* データを設定 */ ]箇所と同じである。

構造体配列を別関数local_funcで参照または更新する

/* ローカル関数 */
void local_func( strOutData * str , int cnt ) {

  int i;

  /* 添字を使ってポインタにアクセス */
  for( i=0;i<cnt;i++ ) {
    strncpy( str[i].cdata , "xyz" , sizeof( str[i].cdata ));
    str[i].idata = 789;
  }
}


Copyright © 2008-2015 http://hitorilife.com All Rights Reserved.