2017-05-09 31 views
0

私は数字を与えられ、構造体のリストを含む構造体を指すポインタは、基本的にはすべてのリストを調べて、構造体の中に何番目の構造体があるかを調べることです。ポインタで構造体内のリスト内の構造体にアクセスする方法は?

typedef struct struct1 { int num; } struct1; 

typedef struct struct2 { 
    struct1 somestruct1; 
    struct2 *pnext; 
} struct2; 

struct struct3 { 
    struct2 somestruct2; 
}; 

私は、コードに新たなんだと、私はこれを把握することができないよう、ここにstruct3

struct3 temp->somestruct2.somestruct1.num ; 

答えて

0
struct3 s3; 

int num = s3.somestruct2.somestruct1.num; 
へのポインタを与えられた私は、いくつかの struct1でnum個のフィールドにアクセスしようとしている方法です

または

struct3 *s3; 

int num = s3->somestruct2.somestruct1.num; 
0

は、使用するかどうかのために、あなたの混乱があるかもしれないようです「」または「 - >」ここ

が一般的なルールです...左の項目がポインタである

場合、使用「 - >」。ポインタでない場合は、 "。"を使用します。

"temp"が "struct struct3 temp"と定義されている場合、tempはポインタではありません。したがって、それに続いて "。" tempのサブ要素にアクセスする。

一時サブ要素 "somestruct1"もstruct2のポインタとして定義されていません。したがって、somestruct1のサブ要素にアクセスするには、 "。"が続かなければなりません。

temp.somestruct2.somestruct1.num 
0

これはどのように行うことができるかの例です。

#include <stdlib.h> 
#include <stdio.h> 

typedef struct struct1 { int num; } struct1; 

typedef struct struct2 { 
    struct1 somestruct1; 
    struct struct2 *pnext; 
} struct2; 

struct struct3 { 
    struct2 somestruct2; 
}; 

int main() 
{ 
    struct struct3* s = malloc(sizeof(struct struct3)); 

    s->somestruct2.somestruct1.num = 1; 
    printf("%d\n", s->somestruct2.somestruct1.num); 

    free(s); 
} 

ポインターがある場合は、そのポインターを参照する前に逆参照する必要があります。逆参照演算子は単体である*、次にstructメンバーにアクセスするには.です。

限り手、あなたはこれは非常に一般的な操作であり、それらを組み合わせても、非常に醜いので、オペレータは、したがって、

s->somestruct2.somestruct1.num = 1; 
->ある

(*s).somestruct2.somestruct1.num = 1; 

を書くことができ

関連する問題