c语言进阶7-结构体

1、  结构体:

在程序设计基础当中咱们学习了变量,变量能够节省使用空间相对于常量而言,你们来看下表:编程

学号windows

姓名 数组

职位网络

性别数据结构

数学函数

英语布局

语文学习

总成绩spa

1操作系统

刘琳

班委

50

61

56

167

2

张华

班委

60

60

54

174

3

张三

学生

66

62

52

180

4

陈露

班委

93

54

62

209

5

李明

班委

56

45

88

189

6

李讲

班委

99

56

65

220

若是让你把表中所要输入的数据,每一个数据都用变量来输入的话,那么咱们就要定义多个变量,多个变量使用过程当中比较散乱,那么有什么更好的办法来作这件事呢?这就像excel表格同样,只要有了上面的字段名,分别填写数据就行,那么C语言中就提供了一种构造类型:结构体,它能够很方便的构造出一个类型,这个类型是由多个变量(字段)组成的。

  1. 1.        结构体的概念

结构体:高级语言的一种构造类型。在程序的开发过程当中使用仍是比较普遍的。

 

  1. 2.        结构体变量的定义

(1) 结构体定义的通常格式:

      struct  结构体名

      {

           类型   成员变量1;

           类型   成员变量2;

            ….

           类型   成员变量n;

      };

注:结构体最后的分号不能省略

     例如咱们定义学生结构体:

     struct student

{

            char name[20];

            char sex[10];

            int age;

            int score;

};

 

 

结构体能够像宏同样定义在函数外部,做全局变量来用。也能够定义在函数内部做为局部变量来用。

(2) 结构体变量的定义格式:

struct 结构名 变量名;

例如根据上面定义的学生结构体

struct student stu;

操做实例以下:

 

  1. 3.        结构体变量的引用

结构体变量的引用,实际是引用其各个成员,要使用.或者->

普通变量使用 .     如上图中的s.name   s.sex   s.age   s.score

指针变量使用 –>   如上四个也可能改成s->name    s->sex   s->age   s->score

  1. 4.        结构体类型的初始化

初始化格式:

struct 结构名 变量名={值1,值2,….};

例:struct student stu={“张三”,”男”,18,100};

2、  结构体数组

  1. 1.        定义结构体数组

定义格式:struct 结构名 数组名[常量表达式];

例如学生结构体数组定义

struct student stu[20];

 

  1. 2.        初始化结构体数组

初始化结构体数组格式:

struct 结构名 数组名[常量表达式]={

                                  {值1,值2,….},

                                   ……

                                   {值1,值2,….}

                                };

 struct student stu[3]={

{ “张三”,”男”,18,100},

{ “李四”,”男”,19,90},

{ “王五”,”男”,23,97}

};

3、  结构体指针

  1. 1.        指向结构体变量的指针

定义结构体类型的指针变量格式:

struct 结构名 *指针变量名;

例如学生结构体,定义指针变量s指向学生结构体类型

struct student *s;

     第一种赋值方式:

struct ss

{

       int a;

       int b;

       int c;

}s;

struct ss *p=&s;

第二种赋值方式:

struct ss
{
       int a;
       int b;
       int c;
}s;
struct ss *p;
p=&s;
  1. 2.        指向结构体数组的指针

当定义好结构体数组以后,能够用指针指向,便于移动指针,访问数组的不一样位置的元素。

例如:

struct student stu[20],*p;

p=stu;   //p指针指向stu数组的第一个元素

能够经过p++的方式移动指针,指向后面的元素。

  1. 3.        结构体做为函数参数

参数能够结构体类型的变量、结构体数组

当时结构体数组时候,传递的是数组的首地址,是地址传递.

 

 

4、  共用体的概念

当须要把不一样类型的变量存放到同一段内存单元或对同一段内存单元的数据按不一样类型处理则须要使用共用体数据结构,共用体也称为联合体。

把一个整型变量一个字符型变量一个实型变量放在同一个地址开始的内存单元中

共用体的定义形式

union 共用体名

{

成员列表

}变量列表;

例如定义一个共用体,包括的数据成员有整型、字符型和实型。

union data

{

int i;

char ch;

float f;

}a;

其中a为定义的共用体变量,而union data是共用体类型,还能够像结构体那样将类型的声明和变量定义分开;

union data a;

能够看到共用体其实和结构体相似,可是必定要注意区分:

共用体各成员占相同的起始地址所占内存长度等于最长的成员所占内存

结构体各成员占不一样的地址所占内存长度等于所有成员所占内存之和

 

5、  共用体变量的引用

共用体变量定义完成后,就能够引用其中的成员数据进行使用,引用的通常形式为:

共用体变量.成员名;

只能引用共用体变量的成员以下

 union data a;

 a.i;

 a.ch;

 a.f;

代码参考:

/* Note:Your choice is C IDE */
#include "stdio.h"
union data
{
       int i;
       char ch;
       float f;
       }a;
void main()
{
       union data a;
       a.i=3;
       printf("%d\n",a.i);
       a.ch='a';
       printf("%c\n",a.ch);
       a.f=1.1;
       printf("%f\n",a.f);
}

 

6、  初始化实例

在定义共用体变量时,能够同时对变量进行初始化操做。初始化的值放在一对大括号中。

注意:

对共用体变量初始化时,只须要一个初始化值就足够了,其类型必须和共用体的第一个成员的类型相一致

代码实例以下

/* Note:Your choice is C IDE */

#include "stdio.h"

union data

{

       int i;

       char ch;

};

 

void main()

{

       union data a={97};

       printf("%d\n",a.i);    

       printf("%c\n",a.ch);   

}

 

7、  共用体类型数据的特色

共用体变量中的值是最后一次存放的成员的值如

a.i = 1;

a.ch = 'a';

a.f = 1.5;

完成以上三个赋值语句后共用体边量的值是 1.5而 a.i=1 和 a.ch='a'已无心义

共用体变量不能初始化例

union data

{

int i;

char ch;

float f;

}a={1,'a', 1.5}  错误!!!

共用体经常使用来节省内存,特别是一些嵌入式编程,内存是很是宝贵的!

共用体也经常使用于操做系统数据结构或硬件数据结构!

union在操做系统底层的代码中用的比较多,由于它在内存共赏布局上方便且直观。因此网络编程,协议分析,内核代码上有一些用到union都比较好懂,简化了设计。

8、 共用体类型的注意事项
在使用共用体类型时,须要注意如下特色

1. 同一个内存段能够用来存放几种不一样类型的成员,可是每一次只能存放其中一种,而不是同时存放全部的类型。也就说在共用体中,只有一个成员起做用,其余成员不起做用。
2. 共用体变量中起做用的成员是最后一次存入的成员,在存入一个新的成员后原有的成员就失去做用
3. 共用体变量的地址和它的各成员的地址是同样的
4. 不能对共用体变量名赋值,也不能企图引用变量名来获得一个值。

弹跳球代码

#include <stdio.h>
#include <math.h>
#include <windows.h>
#include "time.h"
int color(int c)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
    return 0;
}
int main()
{
    //FILE *fp = fopen("graph.txt", "w+");
    float x, y, f;
    int z;
    srand((unsigned)time);
    for(;;){
    z=rand()%15+1;
    color(z);
    for(y = 1.6; y >= -1.6; y -= 0.15){
        for(x = -1.1; x <= 1.1; x += 0.05){
            f = x*x + pow(y - pow(x*x, 1.0/3), 2) - 1;        //函数方程 
            //fputc(f <= 1E-5 ? '*' : ' ', fp);
            putchar(f <= 1E-5 ? '*' : ' ');//1E-5等价于1x10^(-5)
        }
        //fputc('\n', fp);
        putchar('\n');
    }
    //fclose(fp);
    Sleep(100);
    system("cls");    
    }
    return 0;
}
相关文章
相关标签/搜索