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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
いちこ
記事: 62
登録日時: 13年前
連絡を取る:

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

#1

投稿記事 by いちこ » 12年前

おはようございます。
初心者です。よろしくおねがいします。

下記のような関係のプログラムを作成しています。
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を呼び出すときで
書き方が違うので少しややこしいと思いました。

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

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

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

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

#2

投稿記事 by beatle » 12年前

いちこ さんが書きました: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 ;
}

いちこ
記事: 62
登録日時: 13年前
連絡を取る:

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

#3

投稿記事 by いちこ » 12年前

>>beatleさん
返信ありがとうございます。
beatle さんが書きました: main内では &b ですよね?
そのとおりです。ご指摘ありがとうございます。


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

閉鎖

“C言語何でも質問掲示板” へ戻る