设为首页收藏本站

融智技术学院

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 428|回复: 0

IT百科——结构(struct)

[复制链接]
MrLi 发表于 2014-3-7 17:00:02 | 显示全部楼层 |阅读模式
结构(struct)
在C语言中一个结构是一个声明,来定义一系列在内存中的一块儿变量到一个名字下,而且允许不同的变量被访问仅仅通过一个指针。
最好的描述结构的方式是通过示例:
  1. struct Point {
  2.    int x;
  3.    int y;
  4. };
复制代码
声明一个名字为“Point”的结构,表明这个结构包含两方面的信息。第一个信息是一个被称为“x”的整型数,第二个信息是一个被称为“y”的整型数。一个结构是一个单一对象,而且这个结构的所有成员被做为一个单元对待。一个指向“Point”结构的指针将指向第一个整型数“x”,紧跟在“x”后的是第二个整型数“y”.
一个结构一旦被声明,变量可以通过它来声明:
  1. struct Point vPoint;
复制代码
声明一个被称为“vPoint”的变量,它是一个“Point”类型的。“vPoint.x”访问结构的整型成员“x”,而“vPoint.y”访问结构的整型成员“y”。它类似于声明一个下面的结构:
  1. typedef struct Point {
  2.    int x;
  3.    int y;
  4. } Point;
复制代码
所以“Point”也被用作“struct Point”一样,就像下面这样:
  1. Point vPoint;
复制代码
在C语言中声明一个结构的普通语法是:
  1. struct tag_name {
  2.    type member1;
  3.    type member2;
  4.    /* declare as many members as desired, but the entire structure size must be known to the compiler. */
  5. };
复制代码
这里tag_name在上下文中是可选的。这样一个结构声明也许出现在一个类型别名的声明或者声明或者变量的定义,但是这样的实体最好分开声明就像是:
  1. typedef struct tag_name struct_alias;
  2. struct tag_name struct_instance_1;
  3. struct_alias struct_instance_2;
复制代码
一个结构的声明由一系列字段组成,每个字段可以是几乎任意的对象类型。一个结构对象要求的全部存储大小是所有字段要求大小的总和,再加上一些内部的填充。
这有3中方式初始化一个结构。对于结构类型
  1. /* Forward declare a type "point" to be a struct. */
  2. typedef struct point point;
  3. /* Declare the struct with integer members x, y */
  4. struct point {
  5.    int    x;
  6.    int    y;
  7. };
复制代码

C89-样式初始化被用于当连续的成员被给出的时候。
  1. /* Define a variable p of type point, and initialize its first two members in place */
  2. point p = {1,2};
复制代码
对于没有连续的或者无序的成员列表,指定初始化方式被使用
  1. /* Define a variable p of type point, and set members using designated  initializers*/
  2. point p = {.y = 2, .x = 1};
复制代码
如果一个初始化被给出或者如果对象是静态分配的,省略的成员被初始化为0
一个第三种方式初始化一个结构是拷贝一个已经存在的相同类型对象的值
  1. /* Define a variable q of type point, and set members to the same values as those of p */
  2. point q = p;
复制代码
下面一个结构赋值给另一个结构做了一些可预期的事。使用memcpy()并不是不需的来使得一个结构类型重复。内存空间已经被给出而且被置0通过声明这种类型的变量而不为成员初始化。这个不该迷惑于内存管理的要求,当处理一个指向结构的指针时。
  1. #include <stdio.h>

  2. /* Define a type point to be a struct with integer members x, y */
  3. typedef struct {
  4.    int    x;
  5.    int    y;
  6. } point;

  7. int main(void) {

  8. /* Define a variable p of type point, and initialize all its members inline! */
  9.     point p = {1,3};

  10. /* Define a variable q of type point. Members are uninitialized. */
  11.     point q;

  12. /* Assign the value of p to q, copies the member values from p into q. */
  13.     q = p;

  14. /* Change the member x of q to have the value of 3 */
  15.     q.x = 3;

  16. /* Demonstrate we have a copy and that they are now different. */
  17.     if (p.x != q.x) printf("The members are not equal! %d != %d", p.x, q.x);

  18.     return 0;
  19. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

新突破电商

小黑屋|手机版|Archiver|融智技术学院 ( 京ICP备09018999号  

GMT+8, 2018-8-17 07:28

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表