ここから本文です

C言語ポインタのアドレスをint型に収める void(* a)(); a = aaa; int b = *a;

changerさん

2020/3/2121:36:04

C言語ポインタのアドレスをint型に収める
void(* a)();
a = aaa;
int b = *a;

このようにすると int型変数bにaaa関数のアドレスが渡されるんですか?

閲覧数:
71
回答数:
4

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

n2q********さん

2020/3/2208:48:33

次のようにすると良いです。

intptr_t d = aaa;

ただ、やはり警告が出るでしょうから次のようにキャストしておくのが適切でしょう。

intptr_t d = (intptr_t)aaa;



《参考》

お示しのコードで a は不要です。直接 int b = aaa; とすれば良いのです。

ただ、問題があります。


64ビット版の Windows の場合、ポインタは64ビットの幅となりますが int 型は32ビットの幅です。このため、b には aaa 関数のアドレスが渡されるとは言えない状況となります。(アドレスの下位32ビットが渡される形です。)

ポインタと同じ幅の整数として intptr_t というものが用意されていますので、これを int の代わりに使えば32ビット版でも64ビット版でも大丈夫となります。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2020/3/25 15:15:20

ありがとうございました。

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

アバター

ID非公開さん

2020/3/2510:34:45

実際に試してみれば?
...
...
...
int型にアドレスを格納する事の良し悪しは別として、
*a は、a のアドレスが指す関数のアドレスを取得する、つまり a と *a は同じ。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

yuk********さん

2020/3/2207:41:07

訳も分からずポインタを使おうとは、神をも恐れぬ愚かな行為ですね。

答)
全然違います。そもそもアドレスはint型に収納しません。
せめて自分が何をしているのかが分かるくらいには物事を学びましょう。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

2020/3/2122:10:13

言語の規格書、とりあえず日本語化されているいわゆるC99、JIS X3010(検索すれば容易に閲覧出来るはずです)によると

---
6.3.2.3 (略)
整数は任意のポインタ型に型変換できる。これまでに規定されている場合を除き,結果は処理系定義とし,正しく境界調整されていないかもしれず,被参照型の実体を指していないかもしれず,トラップ表現であるかもしれない(56)。

任意のポインタ型は整数型に型変換できる。これまでに規定されている場合を除き,結果は処理系定義とする。結果が整数型で表現できなければ,その動作は未定義とする。結果は何らかの整数型の値の範囲に含まれているとは限らない。
---

だそうです。変換できることは保証されるのですが、結果は保証されない、という。私もよくわかりませんが、「アドレスが渡される」ことについては保証できない、といわざるを得ないですね。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる