こんにちは、構造体へのポインタへのポインタの引数をとる関数を持っています。私は私の構造体のメンバーにアクセスするのに問題があります。構造体ポインタは他の型のポインタとは異なった振る舞いをしていますか?構造体へのポインタへのポインタ
printf("%d",(*out)->num);
代わりの
printf("%d",**out.num);
こんにちは、構造体へのポインタへのポインタの引数をとる関数を持っています。私は私の構造体のメンバーにアクセスするのに問題があります。構造体ポインタは他の型のポインタとは異なった振る舞いをしていますか?構造体へのポインタへのポインタ
printf("%d",(*out)->num);
代わりの
printf("%d",**out.num);
いや、「構造体のポインタ」(あなたが意味するものは何でも)が正確にポインタと同じように動作します。これを使用するためのソリューションを可能
struct mystr {
int num;
};
void fun(mystr **out) {
printf("%d",**out.num); <-- where the problem arises
}
他のタイプ。
あなただけoperators precedenceをリコールする必要があります。
.
構造体メンバアクセス
->
構造体メンバアクセスポインタを通じて
(...)
*
間接(間接参照)
( ...)
は、だからあなたの表現**out.num
は*(*(out.num))
として解釈され、あなたの(out.num)
はないポインタである、したがって、それにアスタリスクを適用するとエラーになります。
あなたはバインディングデフォルト以外の演算子を強制的に表現の適切な部分をparenthesiseする必要があります。(**out).num
- 二回最初out
参照解除は、struct mystr
変数に取得し、その変数のnum
メンバーにアクセスします。
->
オペレータは、尖ったstuctureのメンバーにアクセスするためのショートカットとして機能します:
(ptr_expr)->member_name
はそうあなたが(*out)->num
で(**out).num
を置き換えることができ(*(ptr_expr)).member_name
に相当します。
コードのみの回答を避け、これがなぜ機能するのかを説明してください。 – user694733
これは実装すべき方法です。printf("%d",(*(*out)).num);
は1
を印刷します。
#include<stdio.h>
#include<stdlib.h>
struct mystr{
int num;
};
void fun(struct mystr **out) {
printf("%d",(*(*out)).num);
}
int main()
{
struct mystr m;
struct mystr *p;
struct mystr **pp;
p=&m;
pp=&p;
m.num=1;
fun(pp);
return 0;
}
m
、私たちの構造であるp
は、構造体へのポインタであるとpp
はポインタp
へのポインタです。
「問題があります」というのは良い説明ではありません。どのような問題がありますか?エラーメッセージが表示されますか? – klutt
'(* out) - > num'を試しましたか? – xander
コンパイラのメッセージに注意を払う – qrdl