2009-09-03 6 views
0

構造体の変数にはどのようにアクセスできますか?構造体からの変数へのアクセス

int NewMethod(Display **display) 
{ 
    Display *disp=new Display(); 
    *display = disp; 
    disp->a=11; 
} 

**ディスプレイはどういう意味:

typedef struct { 
    unsigned short a; 
    unsigned shout b; 
} Display; 

と私の他のクラスの

は私が方法を持っている:私は、構造体を持っていますか?構造体の変数にアクセスするには ->を使用しましたが、他のメソッドもありますか?

+0

C++をやっているのなら、なぜ古典的な 'typedef struct {/*...*/} 'が表示されますか?参照の代わりにポインタを渡すのはなぜですか?あなたが割り振っているのであれば、なぜ裸のポインタですか? (ああ、その関数は約束した 'int'を返さない) – sbi

答えて

5

テイラー氏によると、ダブルアスタリスクは「ポインタへのポインタ」であり、必要なだけ多くのレベルのポインタを持つことができます。

私はあなたが知っていると確信しているとして、矢印演算子(a->b)は、ポインタを逆参照し、アスタリスクのショートカットで、フィールドにアクセスし、ドット、すなわち

a->b = (*a).b; 

括弧があるため必要ですドットはより強く束縛される。 DISPは、あなたが持っているポインタであるので

Display **dpl = ...; 

(*dpl)->a = 42; 

または

(**dpl).a = 42; 
+0

くそー!私はそれを考えなかった。いい答えだ。 –

0

** displayは単なるダブルポインタ(Display型のポインタへのポインタ)です。

0

**は、そのポインタへのポインタを意味します。基本的には、別のポインタを指していて、別のポインタを指している場合は、Display構造体です。

オブジェクトのみを使用して関数を呼び出した場合は、.演算子を持つメンバーにアクセスできます。

int NewMethod(Display display) 
{ 
Display disp = display; 
disp.a=11; 
} 

しかし、この方法では、Display displayオブジェクトを直接変更するのではなく、ローカルコピーを変更します。あなたのコードは、オブジェクトの変更が関数の外で必要であるため、唯一のオプションはあなたが記述したものであることを示唆しています(おそらくrefferenceによって引数を渡しますが、構文は多かれ少なかれ同じです(->))。

0

:ダブルアスタリスクには、このような作業はありませんが、あなたは最初のデリファレンスはフィールドにアクセスする前に、必要なレベルに到達するためにしなければなりません使用する - >

"正常な"変数(つまり、スタック上)がある場合 表示d;

あなたはd.aを書くことができます

構造体はクラスと同じです。唯一の違いは、すべてのメンバーがデフォルトで公開されていることです。

0

(* disp).a = 11;

は、それは*(*display)としての

2

考えると逆参照と呼ばれています。あなたが整数を設定することができるように機能する整数のアドレスを渡したいときには、使用:あなたがポインタの値を設定することを除いて

void setTo7 (int *x) { 
    *x = 7; 
} 
: : : 
int a = 4; 
setTo7 (&a); 
// a is now 7. 

それはあなたが持っているものとは全く違うませんそのポインタにポインタを渡す必要があります。シンプルな、いいえ?

#include <stdio.h> 
#include <string.h> 

static void setTo7 (int *x) { *x = 7; } 

void appendToStr (char **str, char *app) { 
    // Allocate enough space for bigger string and NUL. 

    char *newstr = malloc (strlen(*str) + strlen (app) + 1); 

    // Only copy/append if malloc worked. 

    if (newstr != 0) { 
     strcpy (newstr, *str); 
     strcat (newstr, app); 
    } 

    // Free old string. 

    free (*str); 

    // Set string to new string with the magic of double pointers. 

    *str = newstr; 
} 

int main (void) { 
    int i = 2; 
    char *s = malloc(6); strcpy (s, "Hello"); 
    setTo7 (&i); appendToStr (&s, ", world"); 
    printf ("%d [%s]\n",i,s); 
    return 0; 
} 

出力は次のとおりです:

これを試してみてください

7 [Hello, world] 

この安全に十分なスペースを割り当てる、別の文字列値を追加します。インテリジェントなメモリ割り当て関数ではダブルポインターがよく使われますが、C++ではネイティブの文字列型が使用されていますが、他のポインターでは便利です。

関連する問題