• C语言里的结构是什么一回事?

    结构声明、变量定义与成员引用等
    服务器君一共花费 28.850 ms 进行了 4 次数据库查询,努力地为您提供了这个页面。
    广告很萌的
    1. Chapter: 结构体基本知识
      1. 1. C语言里的结构是什么一回事?

    结构是什么

    我们来思考一个问题,如果我们要保存一个年级所有学生的信息,我们该如何去做呢?一般思路是用数组去做,因为学号啊,姓名啊,成绩啊,都是同类元素的集合。但是再进一步思考发现,学生的信息还是有不少东西的,比如学号,姓名,各科成绩,电话,家庭住址,那就得要很多数组了,管理起来很麻烦。

    • 在高级语言中,有一种类型叫结构体,就是对基本类型进行重定义,把多个数据类型重新定义成一个新类型。结构体很适合用来表示复杂的数据结构。

    结构是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。(某些语言将结构称为“记录”,比如Pascal语言。)由于结构将一组相关的变量看作一个单元而不是各自独立的实体,因此结构有助于组织复杂的数据,特别是在大型的程序中。

    又比如工资记录是用来描述结构的一个传统例子。每个雇员由一组属性描述,如姓名、地址、 社会保险号、工资等。其中的某些属性也可以是结构,例如姓名可以分成几部分,地址甚至工资也可能出现类似的情况。C语言中更典型的一个例子来自于图形领域:点由一对坐标定义, 矩形由两个点定义,等等。

    在平面坐标图里面,点是最基本的对象,假定用x与y坐标表示它,且x、y的坐标值都为整数。

    结构的声明

    我们可以采用结构存放图中的两个坐标,其声明如下:

    struct point {
    	int x;
    	int y;
    };
    
    • 结构声明:关键字struct引入结构声明。结构声明由包含在花括号内的一系列声明组成。
    • 结构标记:关键字 struct后面的名字是可选的,称为结构标记(这里是point)。结构标记用于为结构命名, 在定义之后,结构标记就代表花括号内的声明,可以用它作为该声明的简写形式。
    • 成员:结构中定义的变量称为成员。结构成员、结构标记和普通变量(即非成员)可以采用相同的名字,它们之间不会冲突,因为通过上下文分析总可以对它们进行区分。另外,不同结构中的成员可以使用相同的名字,但是,从编程风格方面来说,通常只有密切相关的对象才会使用相同的名字。

    变量声明

    struct声明定义了一种数据类型。在标志结构成员表结束的右花括号之后可以跟一个变量表,这与其它基本类型的变量声明是相同的。例如:

    struct { ... } x, y, z;
    

    从语法角度来说,这种方式的声明与声明

    int x, y, z;
    

    具有类似的意义。这两个声明都将x、y与z声明为指定类型的变量,并且为它们分配存储空间。

    • 结构声明后面可以带变量表,也可以不带。如果结构声明的后面不带变量表,则不需要为它分配存储空间,它仅仅描述了一个结构的模板或轮廓。但是,如果结构声明中带有标记,那么在以后定义结构实例时便可以使用该标记定义。

    例如,对于上面给出的结构声明 point 语句:

    struct point pt;
    

    定义了一个struct point类型的变量pt。结构的初始化可以在定义的后面使用初值表进行。初值表中同每个成员对应的初值必须是常量表达式,例如:

    struct point maxpt = {320, 200};
    

    自动结构也可以通过赋值初始化,还可以通过调用返回相应类型结构的函数进行初始化。

    成员引用

    在表达式中,可以通过下列形式引用某个特定结构中的成员:

    结构名.成员
    

    其中的结构成员运算符".”将结构名与成员名连接起来。例如,可用下列语句打印点pt的坐标:

    printf("%d,%d", pt.x, pt.y);
    

    或者通过下列代码计算原点(0, 0)到点pt的距离:

    double dist, sqrt(double);
    dist = sqrt((double)pt.x * pt.x + (double)pt.y * pt.y);
    

    用结构定义结构

    结构可以嵌套。我们可以用对角线上的两个点来定义矩形:

    struct rect {
    	struct point pt1; 
    	struct point pt2;
    };
    

    结构rect包含两个point类型的成员。如果按照下列方式声明screen变量: struct rect screen; 则可以用语句:

    screen.pt1.x 
    

    引用screen的成员pt1的x坐标。

    结构的基本情况到这里应该算描述清楚了。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [软件工程与项目管理] 开始使用Git 3 个条目
  2. [软件工程与项目管理] 浏览器的HTML解析器 8 个条目
  3. [计算机算法] 两数交换的各种算法细节 2 个条目
  4. [移动开发] 从代码角度去认识 Handler 4 个条目
  5. [软件工程与项目管理] 了解一点WebKit 9 个条目
  6. [JavaScript程序设计] 关于HTTP Keep-Alive 6 个条目
  7. [JavaScript程序设计] Web实时通信技术名词解析 5 个条目
  8. [移动开发] Android抽屉导航NavigationDrawer 5 个条目
  9. [PHP程序设计] PHP扩展模块安装 1 个条目
  10. [JavaScript程序设计] jQuery与表单操作 2 个条目
  11. [Python程序设计] Tornado表单处理 3 个条目
  12. [C语言程序设计] 结构体基本知识 1 个条目
窗口 -- [资讯]