1

構造体の変数にどのようにアクセスできますか? 私は構造体を持っています:

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

私の他のクラスにはメソッドがあります:

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

**表示とはどういう意味ですか? 私が使用した構造体の変数にアクセスするに->は、他の方法もありますか?

4

6 に答える 6

5

テイラーが言ったように、二重アスタリスクは「ポインタへのポインタ」であり、必要な数のレベルのポインタを持つことができます。

ご存じのとおり、矢印演算子 ( a->b) は、ポインターを逆参照するアスタリスクと、フィールドにアクセスするドットのショートカットです。

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

ドットがより緊密に結合するため、括弧が必要です。二重アスタリスクにはそのような演算子はありません。フィールドにアクセスする前に、最初に逆参照して必要なレベルに到達する必要があります。

Display **dpl = ...;

(*dpl)->a = 42;

また

(**dpl).a = 42;
于 2009-09-03T06:43:41.330 に答える
2

と考えてください*(*display)。整数を設定できるように、整数のアドレスを関数に渡したい場合は、次を使用します。

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++ ではそれほど使用されませんが、他のポインターには依然として役立ちます。

于 2009-09-03T06:50:01.317 に答える
0

**display は単なる double ポインター (タイプ Display のポインターへのポインター) です。

于 2009-09-03T06:39:25.490 に答える
0

これ**は、ポインターからポインターへのポインターであることを意味します。基本的に、それは別のポインターを指し、それが別のもの、あなたの場合はDisplay構造体を指します。

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

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

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

于 2009-09-03T06:43:31.987 に答える
0

disp は Pointer であるため、使用する必要があります ->

「通常の」変数 (つまり、スタック上) がある場合は、d; を表示します。

あなたはdaを書くことができます

構造体はクラスと同じです。唯一の違い (私が認識しています) は、すべてのメンバーが既定でパブリックであることです。

于 2009-09-03T06:43:54.527 に答える
0

(*disp).a=11; を行うことができます。

それは逆参照と呼ばれます

于 2009-09-03T06:49:31.723 に答える