ページ 11

呼び出された関数からさらに関数を呼ぶときの、ポインタの扱いについて。

Posted: 2013年7月08日(月) 05:32
by いちこ
おはようございます。
初心者です。よろしくおねがいします。

下記のような関係のプログラムを作成しています。
main関数内には、int型の2次元配列a、int型の変数b,cがあります。

main関数内では、関数sub1を呼び出します。
呼び出す際の引数はa,b,cです。
いずれも、sub1内で値を書き換えたいので、アドレスを渡します。

sub1内では、関数sub2を呼び出します。
呼び出す際の引数はa,bです。
ここでも、いずれの値もsub2内でさらに書き換えたいので、アドレスを渡したいです。

コード:

//省略
sub1(int (*a)[10],int *b, int *c);
sub2(int (*a)[10],int *b);
int main(void)
{
  int a[10][10]={/* 省略 */ };
  int b=0;
  int c=0;

  sub1(a,&b,&c);
  //省略
}

void sub1(int (*a)[10], int *b, int *c)
{
  //省略
  sub2(a,b);
  //省略
  return ;
}

void sub2(int (*a)[10], int *b)
{
  //省略
  return ;
}
上のようなプログラムを書いてみましたが、
sub1内で関数sub2を呼び出す際にbのアドレスを引数として渡すのには、このやり方でいいのでしょうか。

実行結果は正しいように思えました。ですが
(当たり前だとは思いますが)同じようにアドレスを渡したいのに、main内では*b、sub1内ではbとなっており
main関数内でsub1を呼び出すときと、関数sub1内でsub2を呼び出すときで
書き方が違うので少しややこしいと思いました。

もっとわかりやすく、(このやり方が間違っているのなら、正しく)
アドレスを渡すにはどうすればいいでしょうか。

曖昧な質問で申し訳ありませんが、
どなたか詳しい方がおられましたら、ご教示お願いいたします。

Re: 呼び出された関数からさらに関数を呼ぶときの、ポインタの扱いについて。

Posted: 2013年7月08日(月) 07:35
by beatle
いちこ さんが書きました:main内では*b、sub1内ではb
main内では &b ですよね?

さて,main内の変数bの型は int ですが,sub1内の変数bの型はint *です.
main内の変数bは整数を格納してある変数,sub1内の変数bはその変数のアドレスを格納してあるポインタ変数です.
したがって,書き方が違うのは当然なのです.
いちこ さんが書きました: もっとわかりやすく、(このやり方が間違っているのなら、正しく)
アドレスを渡すにはどうすればいいでしょうか。
うーん,例えば変数名を変えるとかどうですか?
ポインタ変数は先頭にpをつけるとか.

コード:

int main(void)
{
  int a[10][10]={/* 省略 */ };
  int b=0;
  int c=0;
 
  sub1(a,&b,&c);
  //省略
}
 
void sub1(int (*a)[10], int *pb, int *pc)
{
  //省略
  sub2(a,pb);
  //省略
  return ;
}

Re: 呼び出された関数からさらに関数を呼ぶときの、ポインタの扱いについて。

Posted: 2013年7月09日(火) 11:43
by いちこ
>>beatleさん
返信ありがとうございます。
beatle さんが書きました: main内では &b ですよね?
そのとおりです。ご指摘ありがとうございます。


beatle さんが書きました: 例えば変数名を変えるとかどうですか?
なるほどです。
そちらのほうが同じ変数名なのに*がついていたりついていなかったりで、ぱっと見たときにわかりにくくなるのが
改善されそうです。
そうするようにします。
曖昧な質問でしたが、答えた下さってありがとうございました。