2011-08-10 13 views
3
#include "stdafx.h" 
#include <stdio.h> 

struct s 
{ 
    char *st; 
    struct s *sp; 
}; 

struct s *p1,*p2; 
void swap(struct s *p1,struct s *p2); 

int main() 
{ 
    int i; 
    struct s *p[3]; 
    static struct s a[]={ 
     {"abc",a+1},{"def",a+2},{"ghi",a} 
    }; 
    for(i=0;i<3;i++) 
    { 
    p[i]=a[i].sp; 
    } 
    swap(*p,a); 
    printf("%s %s %s\n",p[0]->st,(*p)->st,(*p)->sp->st); 
    return 0; 
} 
void swap(struct s *p1,struct s *p2) 
{ 
    char *temp; 
    temp = p1->st; 
    p1->st = p2->st; 
    p2->st = temp; 
} 

このプログラムは、abc、abc、ghiとして出力します。私の疑問は、p [0] - > st、(* p) - > st、(* p) - > sp-> st outputs.weはabcまたはghiで初期化されていません。cの文字列と構造

+0

p [0]と* pは本質的に同じものです。 –

+1

あなたは 'st'を初期化していないのですか? –

答えて

4

私たちは、ABCやGHIとintialised STをhaventは。 文字列はどのように出力されますか?

静的に割り当てられたアレイa内の各構造についてstメンバの値は、実際に初期化リストを初期化します。

static struct s a[]={ 
    {"abc",a+1},{"def",a+2},{"ghi",a} 
}; 

を書くのは次のことを書くと、その実行後に同じ効果的な意味を持っています

static struct s a[3]; 
a[0].st = "abc"; 
a[0].sp = a+1; 
a[1].st = "def"; 
a[1].sp = a+2; 
a[2].st = "ghi"; 
a[2].sp = a; 

そして、何効果的に初期化の両方の方法の後に起こったあなたはstruct sの静的に割り当てられた円形のリンクリストを持っています、リスト内の各ノードのデータメンバー(stメンバー)は、 "abc"、 "def"などの文字列リテラルを指しています。spデータメンバーはリンクリストの次のノードを指しています。

+0

これが答えです。私が票がなくなっていないなら、私はあなたにアップボートします。 –

+0

お返事ありがとうございました。私はその答えをはっきりと理解することができました。 – Angus

2

私は、すべての文を解析していませんが、->stへの割り当てと->spはここに起こる:

static struct s a[]={ 
    {"abc",a+1},{"def",a+2},{"ghi",a} 
}; 

残りはポインタを持つゲームですので、出力はあなたが見るものです。したがって、

  1. aアレイが作成され、初期化されます。

  2. forループでは、p配列も初期化されます。

  3. sp再帰的struct sインスタンス、pを指すとaが同じ構造を持っていることを気付か。

  4. pの各要素は、aの要素の1つから取られたstruct sインスタンスを指します。

+0

えええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええと+2がspに割り当てられるように[ – Angus

+0

@Code Monkey:あなたが言うように、 'a + n'は配列位置です。事実は 'struct s'は再帰的構造体であり、' sp'メンバは同じ配列の内部に別の 'struct s'をポイントしています。実際には、私はループ内の 'sp'への代入を見ません...' sp'値はpに割り当てられます... – sergio

+0

@sergio: 'p [i] = a [i] .sp; ' - oops。 –