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

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

 詳しくはこちら


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

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


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

No.21530

ポインタを返す関数のアドレスの出力方法
投稿者---selvid(2005/06/21 16:21:59)


こんにちは。以下のソースなのですが、ポインタを返す関数pfunc()の
アドレスを出力するには、どのように記述すれば正しいアドレス値が
得られるのでしょうか?2通りの方法でやってみたのですが、
「pfunc()」と「pfunc」では違う結果が出ました。この違いについても
よく分かりません。ご存知の方、いらっしゃいましたらレスをお願い
できないでしょうか。関数pfunc()の値を出力するのは「*pfunc()」で
良い(?)かと思うのですが…

#include <stdio.h>

int *pfunc(void);

int main(void)
{
    int dt;

    dt = *pfunc();
    printf("値*pfunc()=%d アドレス*pfunc()=[%p]or[%p]?\n", *pfunc(), pfunc(), pfunc);
    printf("アドレスmain()=%p\n", main);

    return 0;
}

int *pfunc(void)
{
    static int mydt = 100;

    printf("アドレスmydt=%p\n", &mydt);

    return &mydt;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ポインタを返す関数のアドレスの出力方法 21531 おでん 2005/06/21 17:01:15


No.21531

Re:ポインタを返す関数のアドレスの出力方法
投稿者---おでん(2005/06/21 17:01:15)


*pfunc()→*(&mydt)
pfunc()→&mydt
pfunc→&pfunc


この投稿にコメントする

削除パスワード

No.21532

Re:ポインタを返す関数のアドレスの出力方法
投稿者---selvid(2005/06/21 17:29:54)


おでん様、早速のレスありがとうございます。

>*pfunc()→*(&mydt)
>pfunc()→&mydt
>pfunc→&pfunc

「pfunc()」は変数mydtのアドレスを指す、ポインタ(?)ということなの
でしょうか?そして「pfunc」は、pfunc自体のアドレスを別に持っている
ということでしょうか?


この投稿にコメントする

削除パスワード

No.21533

Re:ポインタを返す関数のアドレスの出力方法
投稿者---まきじ(2005/06/21 17:34:11)


>「pfunc()」は変数mydtのアドレスを指す、ポインタ(?)ということなの
>でしょうか?

pfunc() は、mydt のポインタを返してます。
pfunc()が、mydtのポインタではないと思います。

>そして「pfunc」は、pfunc自体のアドレスを別に持っている
>ということでしょうか?

「関数へのポインタ」というものが存在します。



この投稿にコメントする

削除パスワード

No.21536

Re:ポインタを返す関数のアドレスの出力方法
投稿者---selvid(2005/06/21 18:10:54)


まきじ様、レスありがとうございます。
イメージとしては何となく分かるのですが。

>pfunc() は、mydt のポインタを返してます。
>pfunc()が、mydtのポインタではないと思います。
>
>>そして「pfunc」は、pfunc自体のアドレスを別に持っている
>>ということでしょうか?
>
>「関数へのポインタ」というものが存在します。

つまり「pfunc() == mydtのアドレス」であり、
pfunc関数のアドレスはまた別に存在している、ということでしょうか?


この投稿にコメントする

削除パスワード

No.21535

Re:ポインタを返す関数のアドレスの出力方法
投稿者---おでん(2005/06/21 18:05:48)


>「pfunc()」は変数mydtのアドレスを指す、ポインタ(?)ということなの
>でしょうか?そして「pfunc」は、pfunc自体のアドレスを別に持っている
>ということでしょうか?

pfunc()は、戻り値としてmydtのアドレスを返していますから
intへのポインタ(int *)が帰ってきますね? なので、pfunc()の
評価結果はmydtのアドレスになります。また、*pfunc()と書いた時には、
関数が返してきたmydtのアドレスの中身(この場合は、100)になります。

pfuncのように関数名だけが書かれたときは、その関数のアドレス
(エントリポイント)になります。


この投稿にコメントする

削除パスワード

No.21538

Re:ポインタを返す関数のアドレスの出力方法
投稿者---selvid(2005/06/21 18:26:32)


おでん様、すみません。投稿する前にページの更新を忘れていました。
ご丁寧に説明していただき、本当にありがとうございます。

「*pfunc」で関数を宣言しているのに、
何故「pfunc」でアドレスの出力が出来るのかが分からなかったのですが
pfuncはpfuncでアドレスを持っているわけですね。


この投稿にコメントする

削除パスワード

No.21539

Re:ポインタを返す関数のアドレスの出力方法
投稿者---おでん(2005/06/21 18:36:37)


>「*pfunc」で関数を宣言しているのに、

*pfunc()では無く、(int *)(pfunc())です。

従って、関数(pfunc())はintのポインタ(int *)を返す関数です。
関数値(この場合は“int *”)と関数名を混同しないように・・・

>何故「pfunc」でアドレスの出力が出来るのかが分からなかったのですが
>pfuncはpfuncでアドレスを持っているわけですね。

アドレスには違いないのですが、「関数を呼び出した時に最初に制御が
移る場所」と考えてください。


この投稿にコメントする

削除パスワード

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