结构(struct) 是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。 结构中可以使用不同的数据类型。
定义结构变量的一般格式为:
[quote]struct 结构名 {
类型 变量名;
类型 变量名;
...
} 结构变量; [/quote]
结构的初始化/赋值以及输出:
(1)标准定义,在定义结构类型的同时说明结构变量
[quote]struct stru{
int pureSize;
char *pureStr;
} *pure, insted;
struct stru ins = {pureSize:32, pureStr:"o223jflsdfa"}; /* 一站式赋值 */
/* insted.pureSize = 32; // 分步赋值
insted.pureStr = "o223jflsdfa"; */
pure = &ins; /* 将地址赋给结构变量为pure的指针*/
printf("pureSize=%d, pureStr=%s\n", pure->pureSize, pure->pureStr); /* 输出 */
Result:pureSize=32, pureStr=o223jflsdfa[/quote]
(2)用typedef来声明结构,在定义结构类型的同时说明结构变量
[quote]typedef struct stru{
int pureSize;
char *pureStr;
} *pure, insted; /*insted = {56, "23fslffsf222"}; 直接初始化*/
/* insted ins = {pureSize:56, pureStr:"23fslffsf222"}; 一站式赋值 */
insted ins; /* 分步赋值,[b]由于引用别名,所以这里要定义新的结构名ins[/b] */
ins.pureSize = 56;
ins.pureStr = "23fslffsf222";
pure p2 = &ins; /* 将地址赋给别名为pure的指针,[b]由于引用别名,所以这里要定义新的结构名p2[/b] */
printf("%d, %s\n", p2->len, p2->str);
Result:56, 23fslffsf222[/quote]
(3)直接说明结构变量,省去结构名,一般在函数内部声明
[quote]struct {
int size;
char *str;
} *pstr, p;
p.size = 44;
p.str = "sdfsf";
pstr = &p; /* 将地址赋给结构变量为pstr的指针*/
printf("Size=%d, Str=%s\n", pstr->size, pstr->str);
printf("Size=%d , Str=%s\n", (*pstr).size, (*pstr).str); /* 必须有()括起来,因为 . 的优先级比 * 高 */
Result:Size=44, Str=sdfsf[/quote]
联合的声明与访问和结构相同,这里就省略之,下面描述一下[b]联合与结构的区别[/b]:
[quote]1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合转只存放了一个被选中的成员, 而结构的所有成员都存在(联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型和不同长度的变量,而结构的所有成员都保持独立)。
2. 对于[b]联合的不同成员赋值, 将会对其它成员重写[/b], 原来成员的值就不存在了, 而对于[b]结构的不同成员赋值是互不影响的[/b]。 [/quote]
以上例子在 gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)运行通过
定义结构变量的一般格式为:
[quote]struct 结构名 {
类型 变量名;
类型 变量名;
...
} 结构变量; [/quote]
结构的初始化/赋值以及输出:
(1)标准定义,在定义结构类型的同时说明结构变量
[quote]struct stru{
int pureSize;
char *pureStr;
} *pure, insted;
struct stru ins = {pureSize:32, pureStr:"o223jflsdfa"}; /* 一站式赋值 */
/* insted.pureSize = 32; // 分步赋值
insted.pureStr = "o223jflsdfa"; */
pure = &ins; /* 将地址赋给结构变量为pure的指针*/
printf("pureSize=%d, pureStr=%s\n", pure->pureSize, pure->pureStr); /* 输出 */
Result:pureSize=32, pureStr=o223jflsdfa[/quote]
(2)用typedef来声明结构,在定义结构类型的同时说明结构变量
[quote]typedef struct stru{
int pureSize;
char *pureStr;
} *pure, insted; /*insted = {56, "23fslffsf222"}; 直接初始化*/
/* insted ins = {pureSize:56, pureStr:"23fslffsf222"}; 一站式赋值 */
insted ins; /* 分步赋值,[b]由于引用别名,所以这里要定义新的结构名ins[/b] */
ins.pureSize = 56;
ins.pureStr = "23fslffsf222";
pure p2 = &ins; /* 将地址赋给别名为pure的指针,[b]由于引用别名,所以这里要定义新的结构名p2[/b] */
printf("%d, %s\n", p2->len, p2->str);
Result:56, 23fslffsf222[/quote]
(3)直接说明结构变量,省去结构名,一般在函数内部声明
[quote]struct {
int size;
char *str;
} *pstr, p;
p.size = 44;
p.str = "sdfsf";
pstr = &p; /* 将地址赋给结构变量为pstr的指针*/
printf("Size=%d, Str=%s\n", pstr->size, pstr->str);
printf("Size=%d , Str=%s\n", (*pstr).size, (*pstr).str); /* 必须有()括起来,因为 . 的优先级比 * 高 */
Result:Size=44, Str=sdfsf[/quote]
联合的声明与访问和结构相同,这里就省略之,下面描述一下[b]联合与结构的区别[/b]:
[quote]1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合转只存放了一个被选中的成员, 而结构的所有成员都存在(联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型和不同长度的变量,而结构的所有成员都保持独立)。
2. 对于[b]联合的不同成员赋值, 将会对其它成员重写[/b], 原来成员的值就不存在了, 而对于[b]结构的不同成员赋值是互不影响的[/b]。 [/quote]
以上例子在 gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)运行通过