Hii !,私はC/GTK +でプログラミングしていますが、なぜ私が関数を呼び出すと、gtk_label_set_text (GTK_LABEL (label), "some text");
のように、関数へのラベルポインタの参照を渡す必要はありません。私は、Cがすべての引数を値として渡したことを知りました。関数はウィジェットのラベルに影響しません。ありがとう、と私の悪い英語を残念。なぜgtk +が参照渡しになるのですか?
答えて
あなたはポインタを渡しています。 GTK_LABEL(label)は、 'label'の型をキャスト/チェックする単なる空想的なマクロです。しかし、それはポインタで動作し、あなたはgtk_label_set_textへのポインタを渡しています。
また、Cは値をすべて渡します。しかし、それは値として渡すポインタです。ポインタのコピーは同じ 'オブジェクト'を指しているので、gtk_label_set_textは呼び出し元と同じオブジェクトを操作します。 Cにおいて
、あなたがポインタを変更する機能が必要な場合は、参照(int *pointer; myfunction(&pointer);
)によってポインタを渡す、すなわちは異なるメモリアドレスへのポインタポイントを作ります。
GtkLabelのテキストを変更したい場合は、ラベルポインタがどこを指すかを変更する必要はありません。既に適切な場所、つまりおそらくヒープのどこかにある構造体を指しています。あなたがしたいのは、構造体のフィールドの1つの値を "some text"と読み替えるだけです。これが、Gtk + APIがこの場合、ラベルポインタを値渡しする必要があることを指定する理由です。
GTK_LABEL()は、基本的にGtkLabelポインタに汎用GtkWidgetポインタをキャストするマクロです。 GtkLabelオブジェクトを指すGtkWidget * fooを持っている場合、GTK_LABEL(foo)
は、(GtkLabel*)foo
と多かれ少なかれ同じ意味です。 (ポイント付きのオブジェクトが実際にGtkLabelであるというチェックが追加されています).GtkLabelウィジェットの「ラベル」を意味するものではありません。
- 1. なぜ参照渡しが良いですか?
- 2. 参照渡しと参照渡し
- 3. なぜ可変参照ではなく、BufReaderへの不変参照を渡すだけですか?
- 4. C++に "NULL参照"がないのはなぜですか?
- 5. Assembly.GetTypes()に参照が必要なのはなぜですか?
- 6. なぜC++の関数に参照でファイルを渡すべきですか?
- 7. なぜこのプログラムは参照によってパラメータを渡すのですか?
- 8. ディクショナリ値への直接参照を関数に渡すことができないのはなぜですか?
- 9. 参照のコピーローカルプロパティが無効になっているのはなぜですか?
- 10. 参照渡しは単なる遺産ですか?
- 11. const参照で一時的に渡すときにコピーコンストラクタが呼び出されるのはなぜですか?
- 12. オブジェクト参照引数をスレッド関数に渡すのがコンパイルに失敗するのはなぜですか?
- 13. ヌル参照解除でプログラムがクラッシュしないのはなぜですか?
- 14. replaceAllが「不正なグループ参照」で失敗するのはなぜですか?
- 15. このオブジェクト参照が機能しないのはなぜですか?
- 16. Resharperが私のWeb参照を認識しないのはなぜですか?
- 17. attr `android:popupEnterTransition`を参照できないのはなぜですか?
- 18. プライマリキーを参照できないのはなぜですか?
- 19. ローカルスコープがグローバル変数を参照しないのはなぜですか?
- 20. ハンドラへの参照を渡すのではなく、なぜMessengerを使用するのですか?
- 21. std :: thread渡しで参照渡しコピーコンストラクタ
- 22. 参照渡しではなく値渡しの配列を送信するC++
- 23. 参照渡しのパラメーターパック
- 24. なぜこれがnull参照例外をスローしますか?
- 25. フォームオブジェクトを参照渡しに渡す
- 26. 参照で渡さずにC++で参照する
- 27. PHPのオブジェクトが値渡しか参照渡しですか?このコードで
- 28. 参照渡しの疑問
- 29. Mutexオブジェクトは参照渡しですか?
- 30. ポインタは参照渡しですか? (サニティチェック)