2017-11-09 19 views
-2

こんにちは、構造体へのポインタへのポインタの引数をとる関数を持っています。私は私の構造体のメンバーにアクセスするのに問題があります。構造体ポインタは他の型のポインタとは異なった振る舞いをしていますか?構造体へのポインタへのポインタ

printf("%d",(*out)->num); 

代わりの

printf("%d",**out.num); 
+2

「問題があります」というのは良い説明ではありません。どのような問題がありますか?エラーメッセージが表示されますか? – klutt

+4

'(* out) - > num'を試しましたか? – xander

+0

コンパイラのメッセージに注意を払う – qrdl

答えて

5

いや、「構造体のポインタ」(あなたが意味するものは何でも)が正確にポインタと同じように動作します。これを使用するためのソリューションを可能

struct mystr { 
int num; 
}; 

void fun(mystr **out) { 
    printf("%d",**out.num); <-- where the problem arises 
} 
1

他のタイプ。

あなただけoperators precedenceをリコールする必要があります。

  1. .構造体メンバアクセス
    ->構造体メンバアクセスポインタを通じて
    (...)

  2. *間接(間接参照)
    ( ...)

は、だからあなたの表現**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
に相当します。

+0

コードのみの回答を避け、これがなぜ機能するのかを説明してください。 – user694733

1

これは実装すべき方法です。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へのポインタです。

関連する問題