2011-08-10 45 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