【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21052

関数間の引数のやり取りについて
投稿者---リトライマニア(2005/05/14 09:35:46)


C言語の関数の引数のやり取りについて教えていただきたく
書き込みさせていただきました。
例えば以下のように変数aのアドレスをptrにセットし、関数kansuの引数に
セットしてやります。
この場合にkansu側で受け取るaddはアドレスがそのまま入ってきますよね?
また、記述は間違いないでしょうか?
環境を作って実際に実行してみればよい話なのですが、どうも自信が持てなくて質問させていただきました。
申し訳ありませんがどなたかアドバイスお願いいたします。

int *ptr;
int a;

ptr = &a;
kansu(ptr);

void kansu(add)
{
・・・
}


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:関数間の引数のやり取りについて 21053 まきじ 2005/05/14 10:43:56


No.21053

Re:関数間の引数のやり取りについて
投稿者---まきじ(2005/05/14 10:43:56)


>int *ptr;
>int a;
>ptr = &a;
>kansu(ptr);
>
>void kansu(add){}

忘れてるだけだと思いますが、
void kansu(int *add){}
ですね。

>この場合にkansu側で受け取るaddはアドレスがそのまま入ってきますよね?

はい、add には &a(aのアドレス)が入ってます。
よって、*add とすれば、a の値が表示されます。


この投稿にコメントする

削除パスワード

No.21054

Re:関数間の引数のやり取りについて
投稿者---リトライマニア(2005/05/14 11:24:20)


ご返答ありがとうございます。
"*"忘れてました(笑

>はい、add には &a(aのアドレス)が入ってます。
>よって、*add とすれば、a の値が表示されます。

と言うことは、もし仮にvoid kansu(int *add){}の中で
b = add;
などとやってやればbには当然&a(aのアドレス)が入ってくるのですよね?



この投稿にコメントする

削除パスワード

No.21055

Re:関数間の引数のやり取りについて
投稿者---まきじ(2005/05/14 11:38:21)


>b = add;
>などとやってやればbには当然&a(aのアドレス)が入ってくるのですよね?

はい、ind *b = add で *b は a と同じです。


この投稿にコメントする

削除パスワード

No.21056

Re:関数間の引数のやり取りについて
投稿者---iijima(2005/05/14 12:53:16)


自分で簡単なサンプルプログラムを作り、参考書で調べたり人に尋ね
たりして得た知識を確かめることも大事です。
そのような学習法を習慣とすることをお勧めします。
例えば:

#include <stdio.h>

void func( int *p );

int main( void )
{
    int a;
    int* pt = &a;

    printf( "&a in main : %p\n", &a );
    printf( "pt in main : %p\n", pt );

    func( pt );

    return 0;
}

void func( int* p )
{
    int* q = p;
    printf( "p  in func : %p\n", p );
    printf( "q  in func : %p\n", q );
}



この投稿にコメントする

削除パスワード

No.21057

Re:関数間の引数のやり取りについて
投稿者---iijima(2005/05/14 13:03:34)


補足:printf関数内の書式指定は、"%p"よりも"%x"の方が好ましいかも知れません。



この投稿にコメントする

削除パスワード

No.21058

Re:関数間の引数のやり取りについて
投稿者---リストラマニア(2005/05/14 18:20:23)


みなさん、書き込みありがとうございます。
実際にサンプルを作ってやってみたのですが、実行エラーとなってしまい、記述に自信がなくなり書き込みさせていただきました。
環境を変えて実行してみたら問題なかったので記述はあってたようです。
ありがとうございました。


この投稿にコメントする

削除パスワード

No.21060

Re:関数間の引数のやり取りについて
投稿者---iijima(2005/05/14 18:26:21)


>実際にサンプルを作ってやってみたのですが、実行エラーとなってしまい、
>環境を変えて実行してみたら問題なかったので記述はあってたようです。

ある環境で実行時エラーが発生したプログラムについて、違う環境ではエラーとならないことをもって問題なしと判断することはできません。
実行時エラーの原因を追及すべきです。
実行時エラーが生じたサンプルを掲げていただければ、原因が分かるかも知れません。


この投稿にコメントする

削除パスワード

No.21059

Re:関数間の引数のやり取りについて
投稿者---YuO(2005/05/14 18:22:49)


>補足:printf関数内の書式指定は、"%p"よりも"%x"の方が好ましいかも知れません。

%xに対応する引数がunsigned intでない場合,動作は未定義とされています。
故に,ポインタを出力する為に%xを使ってはいけません



この投稿にコメントする

削除パスワード

No.21061

Re:関数間の引数のやり取りについて
投稿者---iijima(2005/05/14 18:30:03)


> 故に,ポインタを出力する為に%xを使ってはいけません。

ご指摘のとおりであることを確認しました。
余計な補足でした。忘れてください。




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧