2011-08-10 61 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輸出是什麼。我們沒有用abc或ghi初始化st。它如何輸出字符串?c中的字符串和結構

+0

p [0]和* p基本上是相同的東西。 – 2011-08-10 17:20:02

+1

你是什麼意思,你沒有初始化'st'? –

回答

4

我們還沒有intialised ST與ABC或GHI。它如何輸出 字符串?

爲靜態分配陣列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

這回答了它。如果我沒有投票,我會讚揚你。 – 2011-08-10 17:28:29

+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實例,pa具有相同的結構;

  4. p的每個元素指向從a的元素之一取得的struct s實例。

+0

是啊.. a + 2被分配到sp,所以移動到[]的第三個位置將st指定爲「ghi」。感謝sergio。 – Angus

+0

@Code Monkey:像你說的那樣,'a + n'是一個數組位置,事實是'struct s'是一個遞歸結構,其'sp'成員指向同一個數組內的另一個'struct s';實際上,我沒有看到循環中的'sp'的任何賦值...'sp'的值被賦值給p ... – sergio

+0

@sergio:我的意思是,'p [i] = a [i] .sp; ' - 哎呀。 – 2011-08-10 17:31:30