精华内容
下载资源
问答
  • 如图 ![图片](https://img-ask.csdn.net/upload/201703/09/1489062938_966714.png)
  • c语言结构体学习整理(结构体初始化,结构体指针)

    万次阅读 多人点赞 2018-11-01 20:22:12
    c语言中交换两个结构体的值(结构体指针) 1关于语言的结构体: 首先我们为什么要用到结构体,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活...

    渣渣c的c语言学习之路

    1.关于c语言的结构体:

    首先我们为什么要用到结构体,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用,然而,在我们实际应用中,每一种变量进行一次声明,再结合起来显然是不太实际的,类如一位学生的信息管理,他可能有,姓名(char),学号(int)成绩(float)等多种数据。如果把这些数据分别单独定义,就会特别松散、复杂,难以规划,因此我们需要把一些相关的变量组合起来,以一个整体形式对对象进行描述,这就是结构体的好处。

    2首先我们要了解一些小知识

    2.1**只有结构体变量才分配地址,而结构体的定义是不分配空间的。**
    2.2结构体中各成员的定义和之前的变量定义一样,但在定义时也不分配空间。
    2.3结构体变量的声明需要在主函数之上或者主函数中声明,如果在主函数之下则会报错
    2.4c语言中的结构体不能直接进行强制转换,只有结构体指针才能进行强制转换
    2.5相同类型的成员是可以定义在同一类型下的
    列如

    
    struct Student
    { 
    	int number,age;//int型学号和年龄
    	char name[20],sex;//char类型姓名和性别
    	float score;
    }

    最后的分号不要忘了 有的编译器会自动加上,因此有的同学就会不注意。

    3关于结构体变量的定义和引用

    在编译时,结构体的定义并不分配存储空间,对结构体变量才按其数据结构分配相应的存储空间

    
     struct Book
     { 
     	char title[20];//一个字符串表
    
    示的titile 题目
    	char author[20];//一个字符串表示的author作者
     	float value;//价格表示 
     };//这里只是声明 结构体的定义 
    struct Book book1,book2;//结构体变量的定义 分配空间
    
    book1.value;//引用结构体变量
    

    定义结构体变量以后,系统就会为其分配内存单元,比如book1和book2在内存中占44个字节(20+20+4)具体的长度你可以在你的编译器中使用sizeof关键字分别求出来。
    列如

    当然,要注意一点:用sizeof关键字求结构体长度时,返回的最大基本类型所占字节的整数倍 比方说我们上面求得的为44 为 float(4个字节)的整数倍,
    但是我们把title修改为title[22]; 这时正常长度为46 ,但是你会发现实际求得的为48,(4的整数倍)

    这就涉及到结构体的存储

    1结构体整体空间是占用空间最大的成员(的类型)所占字节数的整数倍。

    2.结构体的每个成员相对结构体首地址的偏移量(offset)都是最大基本类型成员字节大小的整数倍,如果不是编译器会自动补齐,

    关于这个我们简单介绍下:

    1.偏移量----偏移量指的是结构体变量中成员的地址和结构体变量首地址的差。即偏移字节数,结构体大小等于最后一个成员的偏移量加上他的大小,第一个成员的偏移量为0,

    struct S1
    {
        char a;
    
        int b;
    
        double c;
    };
    

    这里char a 偏移量为1 之后为int b 因为偏移量1不为int(4)的整数倍,所以会自动补齐,而在 double c 时,偏移量为8 是double(8)的整数倍,所以不用自动补齐 最后求得结构体得大小为 16

    具体看下图:
    在这里插入图片描述
    通过上面的代码同学们应该会有一个简单的认知

    4结构体变量的初始化

    结构体的初始化有很多需要注意的地方,这里我们说明下
    首先是几种初始化的方法
    ps在对结构体变量初始化时,要对结构体成员一一赋值,不能跳过前面成员变量,而直接给后面成员赋初值,但是可以只赋值前面几个,对与后面未赋值的变量,如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’

    4.1定义时直接赋值

    struct Student
    { 
    	char name[20];
    	char sex;
    	int number;
    }stu1={"zhaozixuan",'M',12345};
    //或者
    struct Student
    { 
    	char name[20];
    	char sex;
    	int number;
    }struct Student stu1={"zhaozixuan",'M',12345};
    
    

    注意字符为‘ ’ 字符串为""
    4.2定义结构体之后逐个赋值

    stu1.name="王伟";
    stu1.sex='M';
    stu1.number=12305;
    //也可用strcpy函数进行赋值
    strcpy(stu1.name,"王伟");
    
    

    4.3定义之后任意赋值

     struct Student stu1={
      .name="Wang",
      .number=12345,
      .sex='W', 
     };//可以对任意变量赋值
    

    这样写的好处时不用按照顺序来进行初始化,而且可以对你想要赋值的变量直接进行赋值,而不想赋值的变量可以不用赋值

    需要注意的是如果在定义结构体变量的时候没有初始化,那么后面就不能全部一起初始化了;

    等下结构体数组初始化时我们还会有一个讲解

    这里我们顺带提一下typedef说明结构体类型


    这里的BOOK就相当于struct book的一个别名一样,用它来定义结构体变量非常简便
    主要也是考二级要用到,所以我们简单介绍下

    5结构体变量的引用(输出和输入)

    5.1结构体变量的赋值用scanf赋值和printf输出时跟其他变量操作一样
    但是有几点需要注意
    (1) .是运算符,在所有运算符优先级中最高
    (2)如果结构体的成员本身是一个结构体,则需要继续用.运算符,直到最低一级的成员。

    struct Student
    {	char name[20];
    	char sex;
    	int number;
    	struct Date
    	{
    		int year;
     		int month;
     		int day;
    	}birthday;
    
    }stu1;
    printf("%d",stu1.birthday);//这样子是错误的,因为birthday也是一个结构体变量
    scanf("%d",&stu1.birthday.month);//正确
    

    (3)可以引用接头体变量成员的地址,也可以引用结构体变量的地址:

    printf("%o", student);(输出student的首地址)(%o 按八进制输出)

    6结构体数组及其初始化(重点)

    这里我们简单说下,具有相同类型的结构体变量组成数组就是结构体数组

    结构体数组与结构体变量区别只是将结构体变量替换为数组

    struct Student
    { 
    	char name[20];
    	char sex;
    	int number;
    }stu1[5]={
    	 {"zhaozixuan",'M',12345},
    	 {"houxiaohong",'M',12306},
    	 {"qxiaoxin",'W',12546},
    	 {"wangwei",'M',14679},
    	 {"yulongjiao",'W',17857}
    };
    stu1[3].name[3]//表示stu1的第三个结构变量中姓名的第五个字符
    //若初始化时已经是结构体数组全部元素[]中的数可以不写如stu1[]=
    

    注意结构体数组要在定义时就直接初始化,如果先定义再赋初值是错误的
    比如:

    struct Student stu1;
    stu1[3]={
      {"zhaozixuan",'M',12345},
      {"houxiaohong",'M',12306},
      {"qxiaoxin",'W',12546}
      };
      
    

    这样子是错误的,

    这里我在写的时候遇到一些问题,还是结构体数组初始化的问题,折腾了下解决了,给大家分享下
    对于数组初始化时
    比如

    char str[20];
    str="I love you";/* 这样会修改数组的地址,但是数组的地址分配之后是不允许改变的 */
    
    

    在第一条语句中 str就已经被定义成数组而在C99标准中不允许将字符串(实际上是一个指针变量) 赋值给数组,所以如果我们直接赋值是错误的

    那么怎么弄呢
    这里提供3种方法

    1.定义数组时直接定义
    char str[20]=“I love you”;

    2.用strcpy或者memset函数进行复制
    char str[20];
    strcpy(str,“I love you”);
    再用到memset函数时,出现了一些问题
    对于memcset函数简单介绍下

    memset
    void *memset(void *s,int c,size_t n)
    作用:将已开辟内存空间s的首n个字节的值设为值c。

    char str[20];
    memset(str,'a',20);
    

    如果是字符类型数组的话,memset可以随便用,但是对于其他类型的数组,一般只用来清0或者填-1,如果是填充其他数据就会出错

    int str[10];
    memset(str,1,sizeof(str));//这样是错误的
    
    

    这里我们说下这个错误,

    首先我们要知道memset在进行赋值时,是按字节为单位来进行赋值的,每次填充的数据长度为一个字节,而对于其他类型的变量,比如int,占4个字节 所以sizeof(str)=40; 而用memset赋值时,将会对指向str地址的前40个字节进行赋值0x01(00000001) 的操作,把0x00000000赋值4次0x01操作变为0x01010101(00000001000000010000000100000001)

    相当于给“前10个int”进行了赋值0x01010101的操作 对应十进制的16843009
    所以会出很大的错误

    这里请务必要注意,但是如果是清零一个数组用memset还是很方便的
    简单使用的话同学们用strcmp函数就行

    3用指针(注意内存分配)
    char *str;
    str=“I love you”;

    这两句话的本质是,在内存中开辟一段内存空间,把"I love you"放进这段内存空间,然后把这段内存空间的地址交给str,由于str是变量,所以给它赋值是合法的。

    请注意,在我们进行数组初始化的时候如果定义的数组过长,而我们只初始化了一部分数据,对于未初始化的数据如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’ 即不足的元素补以默认值
    这里我们在4小节中也提到了
    比如

    int str[10]={1};//这里只是把str的第一个元素赋值为1,其他元素默认为0
    
    



    7结构体与指针

    我们知道,指针指向的是变量所占内存的首地址,在结构体中,指针指向的是结构体变量的起始地址,当然也可指向结构体变量的元素
    这里我们分为三部分
    7.1指向结构体变量的指针

    定义形式一般为
    struct 结构体名* 指针名;
    比如: struct Student* p;

    struct Student
    {	
    	char cName[20];
     	int number;
     	char csex;  
    }student1;
    struct Student*p;
    p=&student1;
    //若为结构体数组则
    struct Student stu1[5];
    struct Student*p;
    p=stu1;//因为stu1为结构体数组而p=stu1直接是指向stu1的首地址,就不用再加&符
    
    

    用结构体指针变量访问结构体变量成员有以下两种方式:
    (*p).cName //这里的括号不能少,在5.1中有提到
    p->cName

    简单来说以下三种形式是等价的

    p->cName
    (*p).cName 
    student1.cName
    p->cName //可以进行正常的运算
    

    p->number++; 是将结构体变量中number的值进行运算,然后再加一,
    这里要注意下,等下在7.2中会有比较

    7.2指向结构体数组的指针

    7.1中我们已经提到结构体数组指针的命名,这里我们仅对一些知识点做下介绍
    这里我们接着来说结构体数组指针
    在我们想要用指针访问结构体数组的第n个数据时可以用

    struct Student stu1[5];
    struct Student*p;
    p=stu[n];
    (++p).number//是指向了结构体数组下一个元素的地址
    
    

    7.3结构体成员是指针类型变量
    比如

    struct Student
    {
     	char* Name;//这样防止名字长短不一造成空间的浪费
     	int number;
     	char csex;  
    }student1;
    
    

    在使用时可以很好地防止内存被浪费,但是注意在引用时一定要给指针变量分配地址,如果你不分配地址,结果可能是对的,但是Name会被分配到任意的一的地址,结构体不为字符串分配任何内存存储空间具有不确定性,这样就存在潜在的危险,

    struct Student
    {
     	char* Name;
     	int number;
     	char csex;  
    }stu,*stu;
    
    stu.name=(char*)malloc(sizeof(char));//内存初始化
    

    这里我们说一下,同学们看书的时候一般不会看到,
    如果我们定义了结构体指针变量,他没有指向一个结构体,那么这个结构体指针也是要分配内存初始化的,他所对应的指针类型结构体成员也要相应初始化分配内存

    struct Student
    {
     	char* Name;
     	int number;
    	char csex;  
    }stu,*stu;
    stu = (struct student*)malloc(sizeof(struct student));./*结构体指针初始化*/
      stu->name = (char*)malloc(sizeof(char));/*结构体指针的成员指针同样需要初始化*/  
    
    

    7.4二叉树遍历算法
    二叉树的二叉链表类型定义如下:
    typedef struct btnode {
    datatype data;
    struct btnode *lchild,*rchild;
    };
    这里我们仅仅提出以下,因为涉及到链表,感兴趣的同学可以去学习下(二级要用),
    7.5结构体作为函数参数

    首先我们要注意的一点,使用结构体变量作为函数参数的时候,采取的是值传递的方式,将结构体所占内存单元的内容全部传递给形参,并且形参必须也要是同类型的结构体变量,在使用时,会自动创建一个结构体变量作为原变量的副本,并且也需要占内存,并且在调用期间如果修改(形参)结构体中成员的值,修改值是无效的

    而如果用指针作为实参,传递给函数的形参,这时候传递的是结构体的地址,形参所指向的地址就是结构体变量的地址,这时候进行修改的话是可以修改的,这正是指针的精华所在

    在这里我们再提供几种互换两个结构体的方法

    struct Student
    {
     char cName[20];
     int number;
     char csex;  
    }student1,student2;
    struct Student student1={"Wang",12345,'W'};
    struct Student student2={"Zhao",54321,'M'}; 
    struct Student*stu1=&student1;
    struct Student*stu2=&student2;
    
    struct Student *student3;
    student3=stu1;
    stu1=stu2;
    stu2=student3;//互换地址
    
    2对于同类型结构体直接互换值就行
    struct stu student3;
    student3=student1;
    student1=student2;
    student2=student3;
    //这里也可以写成应strcmp函数互换
    
    3memcpy()函数进行互换
    
    
    4比较笨的方法: 用for循环互换
    

    最后提下memset清空结构体

    struct Student
    {
     char cName[20];
     int number;
     char csex;  
    }stu1;
    
    一般情况下,清空str的方法:
      str.cName[0]='\0';
      str.csex='0';
      str.number=0;
      但是我们用memset就非常方便:
      memset(&str,0,sizeof(struct Student));
      如果是数组:
      struct Student stu[10];
      就是
      memset(stu,0,sizeof(struct Student)*10);
    

    整理不易,点个赞再走呗!

    展开全文
  • C语言结构体与链表 第 10章 CHAPTER 10 结构体与共用体 学习目标 本章主要介绍结构体的定义和使用方法,然后介绍链表的概念和相关操作,最后介绍两种新的数据类型——共用体和枚举。通过本章的学习,需要掌握结构体...

    41528d3028836879cd698677c3999917.gifC语言结构体与链表

    第 10章 CHAPTER 10 结构体与共用体 学习目标 本章主要介绍结构体的定义和使用方法,然后介绍链表的概念和相关操作,最后介绍两种新的数据类型——共用体和枚举。通过本章的学习,需要掌握结构体的概念与结构体类型的定义方法,熟练掌握结构体变量的定义、引用和初始化方法,掌握链表的概念,熟练掌握链表的相关操作,了解共用体和枚举的概念及其使用方法。 实际问题中,经常需要对一些类型不同但又相互关联的数据进行处理。比如,对一个学生而言,他的学号(num)、姓名(name)、性别(sex)、年龄(age)、成绩(score)等数据都与该学生有联系。如果将num、name、sex、age、score分别定义成相互独立的简单变量,则无法反映它们之间的内在联系;又因为这些数据彼此类型不同,而数组只能对同种类型的成批数据进行处理,所以,此时也无法使用数组。这就需要有一种新的数据类型,它能将具有内在联系的不同类型的数据组合成一个整体,在C语言里,这种数据类型就是“结构体”。 结构体属于构造数据类型,它由若干成员组成,成员的类型既可以是基本数据类型,也可以是构造数据类型,而且可以互不相同。由于不同问题需要定义的结构体中包含的成员可能互不相同,所以,C语言只提供定义结构体的一般方法,结构体中的具体成员由用户自己定义。这样,编程人员可以根据实际需要定义各种不同的结构体类型。 10.1 结 构 体 结构体遵循“先定义后使用”的原则,其定义包含两个方面,一是定义结构体类型;二是定义该结构体类型的变量。 10.1.1 结构体类型的定义 格式:struct 结构体类型名 { 类型1 成员名1; 类型2 成员名2; M 类型n 成员名n; }; 功能:定义一种结构体类型。 例如,图10.1所示结构体类型可有如下定义: num name sex birthday score year month day 图10.1 struct student结构体类型组织结构图 struct date { int year; int month; int day; }; struct student { int num; char name[20]; char sex; struct date birthday; float score; }; 【说明】① “结构体类型名”与“成员名”都遵循标识符命名规则。 ② 成员类型可以是除本身所属结构体类型外的任何已有数据类型。 ③ 在同一作用域内,结构体类型名不能与其它变量名或结构体类型名重名。 ④ 同一个结构体各成员不能重名,但允许成员名与程序中的变量名、函数名或者不同结构体类型中的成员名相同。 ⑤ 结构体类型的作用域与普通变量的作用域相同:在函数内定义,则仅在函数内部起作用;在函数外定义,则有全局作用域。 【注意】结构体类型定义的末尾必须有分号。 10.1.2 结构体变量的定义、引用和初始化 1.结构体变量的定义 (1)先定义结构体类型,再定义结构体变量。如 struct date { int year; int month; int day; }; struct date date1,date2; (2)定义结构体类型的同时定义结构体变量。如 struct student { int num; char name[20]; char sex; struct date birthday; float score; }stu1,stu2; (3)直接定义结构体变量。如 struct { int num; char name[20]; char sex; struct date birthday; float score; }stu1,stu2; 【说明】① 结构体类型与结构体变量是两个不同的概念。前者只声明结构体的组织形式,本身不占用存储空间;后者是某种结构体类型的具体实例,编译系统只有定义了结构体变量后才为其分配内存空间。 ② 结构体变量各成员存储在一片连续的内存单元中。 ③ 可以用sizeof测出某种基本类型数据或构造类型数据在内存中所占用的字节数。如pirntf(“%d“,sizeof(struct student)); 【思考】测试并分析struct student类型的结构体变量在内存所占用存储空间的长度。 2. 结构体变量的引用 (1)使用成员运算符引用结构体变量的成员。 格式:结构体变量名.成员名 功能:引用结构体变量中指定名称的成员变量。如 struct student stu1,stu2; int age; stu1.num=1001; gets(stu1.name); scanf(“%d“, age=2006-stu1.birthday.year; (2)使用指针运算符和成员运算符引用结构体变量的成员。如 struct student stu,*p= (*p).num=10001; scanf(“%s“,(*p).name); scanf(“%f“, (3)使用指向运算符“->”引用结构体变量的成员。如 struct student stu,*p= p->num=10001; scanf(“%s“, p->name); scanf(“%f“, printf(“age of %s is %d\n“,stu.name,age); (4)将结构体变量作为一个整体进行操作。如 struct student stu1,stu2,*p= stu2=stu1; printf(“the address of struct student variable stu2 is %x“, 【说明】① “(*p).成员名”、“p->成员名”与“stu.成员名”等价,不过后两种方式更直观。 ② 成员运算符“.”与指向运算符“->”的优先级相同,都高于指针运算符“*”。 【注意】不能将结构体变量当作一个整体进行输入、输出或赋值,如 struct date date1,date2; date1={1988,8,5}; scanf(“%d%d%d“, printf(“%d%d%d“,date2); 【思考】“(*p).成员名”中的圆括号能否省略? 3.结构体变量的初始化 在定义结构体变量的同时,按照所属结构体类型的组织形式依次写出全部或部分成员变量的初始值。如: struct

    展开全文
  • C语言结构体实验报告 《高级语言程序设计》实验报告 实验序号:8 实验项目名称:结构体 学 号 姓 名 专业、班级 实验地点 指导教师 实验时间 一、实验目的及要求 1、掌握结构体变量的定义和使用; 2、掌握结构体数组...

    41528d3028836879cd698677c3999917.gifC语言结构体实验报告

    《高级语言程序设计》实验报告 实验序号:8 实验项目名称:结构体 学 号 姓 名 专业、班级 实验地点 指导教师 实验时间 一、实验目的及要求 1、掌握结构体变量的定义和使用; 2、掌握结构体数组的定义和使用; 3、了解结构指针的定义和使用 二、实验设备(环境)及要求 使用turbo c 2.0+windows系列操作系统的环境。 三、实验内容与步骤 1.学生成绩管理:有5个学生,每个学生的数据包括学号、班级、姓名、三门课成绩。从键盘输入5个学生数据,要求打印出每个学生三门课的平均成绩,以及每门课程平均分、最高分学生数据(包括学号、班级、姓名、三门课成绩,平均分)。 【实验要求】 (1) 定义学生结构体。 (2) 用一个函数实现5个学生数据的输入,用另一个函数负责求每个学生三门课程的平均成绩,再用一个函数求出平均分最高的学生并输出该学生的数据。要求平均分和平均分最高的学生数据都在主函数种输出。 【实验提示】 (1) 结构体定义 struct Student { int num; //学号 char name[20]; //班级注意字节长度 char classname[20]; //班级 float score[3]; //三门课程成绩 float aver_score; //平均分 } (2) 数据组织提示: 在主函数中定义一个结构体数组。 Student stu[20] //定义有20个变量的元素的结构体数组(根据需要确定数组的大小)。 (3) 结构体数组使用 ①循环输入学生信息: ②平均分计算函数 ,以数组名作参数 void averagescore(student stu[], int number) { int i; for(i = 0; i<= number; i++) { Stu[i] = (stu[i].score[0]+ stu[i].score[1]+stu[i].score[2])/3.0 } } ③求平均分最高的学生 int averagescore(student stu[], int number) { int k = 0; //查找最高平均分并记录在数组中的下标值 for( int i = 0; i<= number; i++) { ……… } return k; //返回最高平均分数组元素的下标 } 【测试数据】 自己设计一组测试数据。 运行结果截图: 【思考与扩展】 如果这样定义结构体 typedef struct Student { int num; //学号 char name[20]; //姓名 注意字节长度 char classname[20]; //班级 float score[3]; //三门课程成绩 float aver_score; //平均分 } STU,* pSTU; 说明如下三条语句的含义: student stu1; STU stu2; pSTU pstu; 2.采用结构体数组编写程序,定义一个含职工姓名、工作年限、工资总额的结构体类型,初始化5名职工的信息,最后再对工作年限超过30年的职工加100元工资,然后分别输出工资变化之前和之后的所有职工的信息。 运行结果截图 3.定义一个结构体变量(包括年、月、日)。计算某年某月某日是本年中第几天?注意闰年问题。 运行结果截图: 四、分析与讨论 对上机实践结果进行分析,上机的心得体会。 五、教师评语 签名: 日期: 成绩 附源程序清单: 1. #include struct student { int num; char name[20]; char classname[20]; float score[3]; float aver_score; }stu[5]; void () { int i; for(i=1;i<6;i++) {printf(“第%d个同学“,i); printf(“请输入学号 名字 班级 三门课程成绩:\n“); scanf(“%d %s %s %f %f %f“, } }; void averagescore() { int i; for(i=1;i<=5;i++) stu[i].aver_score=((stu[i].score[1]+stu[i].score[2]+stu[i].score[3])/3); printf(“平均成绩:“); for(i=1;i<6;i++) printf(“第%d个同学的平均成绩%f:\n“,i,stu[i].aver_score); printf(“\n“); }; void max() { int i,k=0; float temp=stu[1].aver_score; for(i=2;itemp) {temp=stu[i] .aver_score;k=i;}; printf(“成绩最好的同学:\n“); printf(“%d %s %s %4.2f %4.2f %4.2f %4.2f\n“, stu[k].num,stu[k].name,stu[k].classname,stu[k].score[1],stu[k].score[2],stu[k].score[3],stu[k].aver_score); }; void main() { (); averagescore(); max(); } 2. #include struct worker { char name[20]; int workyear;

    展开全文
  • C语言结构体变量与链表知识总结.结构体与链表11.1 结构体类型的定义结构体是由C语言中的基本数据类型构成的、并用一个标识符来命名的各种变量的组合,其中可以使用不同的数据类型。结构体类型的定义Struct结构体名{...

    C语言结构体变量与链表知识总结.

    结构体与链表

    11.1 结构体类型的定义

    结构体是由C语言中的基本数据类型构成的、并用一个标识符来命名的各种变量的组合,其中可以使用不同的数据类型。

    结构体类型的定义

    Struct结构体名

    {类型标识符1 成员名1;

    类型标识符2 成员名2;

    ……

    类型标识符n 成员名n;

    };

    Struct结构体名——结构体类型名

    关于结构体类型的说明:

    “struct 结构体名”是一个类型名,它和int、float等作用一样可以用来定义变量。

    结构体名是结构体的标识符不是变量名,也不是类型名。

    构成结构体的每一个类型变量称为结构体成员,它像数组的元素一样,单数组中元素以下标来访问,而结构体是按结构体变量名来访问成员的。

    结构体中的各成员既可以属于不同的类型,也可以属于相同的类型。

    成员也可以是一个结构体类型,如:

    Struct date

    {

    Int month;

    Int day;

    Int year;

    };

    Struct person

    {

    Float num;

    Char name[20];

    Char sex;

    Int age;

    Struct date birthday;

    Char address[10];

    };

    11.2 结构体类型变量

    11.2.1 结构体类型变量的定义

    先定义结构体类型,再定义结构体变量

    形式:

    Struct 结构体名

    {类型标识符1成员名1;

    类型标识符2成员名2;

    ……

    类型标识符n成员名n;

    };

    Struct 结构体名 变量名表;

    例如:

    Struct student

    {char name[20];

    Char sex;

    Int age;

    Float score;

    };

    Struct student stu1,stu2;

    在定义结构体类型的同时定义变量

    形式:

    Struct 结构体名

    {

    类型标识符1 成员名1;

    类型标识符2 成员名2;

    ……

    类型标识符n 成员名n;

    }变量名表;

    例如:

    Struct student

    {

    Char name[20];

    Char sex;

    Int age;

    Float score;

    }stu1,stu2;

    用匿名形式直接定义结构体类型变量

    形式:

    Struct

    {

    类型标识符1 成员名1;

    类型标识符2 成员名2;

    ……

    类型标识符n 成员名n;

    }变量名表;

    例如:

    Struct

    {

    Char naem[20];

    Char sex;

    Int age;

    Float score;

    }stu1,stu2;

    11.2.2 结构体变量的使用

    结构体是一种新的数据类型,因此结构体变量也可以像其它类型的变量一样赋值、运算,不同的是结构体变量以成员作为基本变量。

    结构体成员的表示方式为:结构体变量名.成员名

    其中的圆点运算符称为成员运算符,它的运算级别最高。

    如果将“结构体变量名.成员名”看成一个整体,则这个整体的数据类型与结构体中该成员的数据类型相同,这样就可以像前面所讲的变量那样使用,但应遵循以下规则:

    不能将一个结构体变量作为一个整体进行输入和输出,而只能对结构体变量中的各个成员分别进行输入和输出。

    Struct date

    {

    Int month;

    Int day;

    Itn year;

    }day;

    Scanf(“%d%d%d”,day);(错误)

    Scanf(“%d%d%d”,&day.year,&day.month,&day.day);(正确)

    Printf(“%d%d%d”,day);(错误)

    Printf(“%d%d%d”,day.year,day.month,day.day);(正确)

    如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最底的一级的成员,只能对最底级的成员进行赋值或存取运算。

    Struct date

    {

    Int month;

    Int day;

    Int year;

    };

    Struct student

    {

    Long num;

    Char naem[20];

    Char sex;

    Int age;

    Struct date birthday;

    Char depart[10];

    }stu1;

    如:stu1.birthday.year=2004;

    Stu1.birthday.month=12;

    对结构体变量的成员可以像同类型普通变量一样进行各种运算。

    11.2.3 结构体变量的初始化与存储

    结构体变量的初始化:在定义结构体变量的同时给它赋以初值。

    Struct student

    {

    Char name[20];

    Char sex;

    Int age;

    Float score;

    }stu1,stu2={“wangwu”,’m’,20,88.5};

    结构体变量所占内存的字

    展开全文
  • C语言结构体和共用体实验报告 (17页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!11.90 积分实验九参考程序实验9-1/*********************************************...
  • c语言 结构体输入输出Control Structure in C defines how the statements in the program are going to execute. A statement is a single line or instruction in a program. C中的控件结构定义了程序中的语句将...
  • C语言结构体实报告《高级语言程序设计》实验报告实验序号:8 实验项目名称:结构体学 号姓 名专业、班级实验地点指导教师实验时间一、实验目的及要求1、掌握结构体变量的定义和使用;2、掌握结构体数组的定义和...
  • C语言结构体输入学生基本信息

    万次阅读 多人点赞 2019-03-21 22:57:34
    输入学生的信息,计算总分以及平均分后输出 #Include<stdio.h> #define N 100 struct Student//创建一个student的结构体 { int num;//学生人数 char name[20];//存储学生姓名的一个数组 cha...
  • C语言结构体与结构体指针的使用

    千次阅读 多人点赞 2020-08-08 22:29:02
    C语言结构体与结构体指针的使用 tips:最近要好好学习一下数据结构,所以必不可少的就是c语言的结构体和结构体指针了,所以就整理一下这些基础知识 c语言结构体(struct)是由一系列具有相同类型或不同类型的数据构成...
  • 结构体的定义与使用 结构体是一种构造数据类型 把不同类型的数据组合成一个整体 结构体的定义形式: struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数组,它们的...
  • 一、结构体的定义1、定义形式struct 结构名{成员列表;}; //定义为语句,分号不能丢2、结构类型变量的声明(1)声明形式1struct student{int number;char name;float score;};struct student st1,st2,st3;(2)声明形式2...
  • c语言结构体实验报告 《高级语言程序设计》实验报告 实验序号:8 实验项目名称:结构体 学 号 姓 名 专业、班级 实验地点 指导教师 实验时间 一、实验目的及要求 1、掌握结构体变量的定义和使用; 2、掌握结构体数组...
  • C语言结构体实现学生信息统计C语言程序设计作业6梁英华200913201054一.6.1和6.2放在一个程序里实现。1.思路:通过结构体和for()来实现学生数据的输入输出,即学号,名字,年龄和性别,并对相关选项判别。2.源程序:...
  • C语言结构体实验报告《高级语言程序设计》实验报告实验序号:8 实验项目名称:结构体学 号姓 名专业、班级实验地点指导教师实验时间一、实验目的及要求1、掌握结构体变量的定义和使用;2、掌握结构体数组的定义和...
  • C语言结构体变量与链表知识总结结构体与链表11.1 结构体类型的定义结构体是由C语言中的基本数据类型构成的、并用一个标识符来命名的各种变量的组合,其中可以使用不同的数据类型。结构体类型的定义Struct结构体名{...
  • 结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针。指向结构体变量的指针前面我们通过“结构体变量名.成员名”的方式引用结构体变量中的成员,除了这种方法之外还可以使用指针。前面讲过,&...
  • C语言结构体例题

    2012-12-27 18:26:29
    C语言结构体例题 可能对初学c语言的同学们有帮助
  • c语言结构体和共同体第八章 结构体与共用体;第八章 结构体与共用体;结构体(struct);结构体的概念;结构体的定义;方法二:struct student { int number; char name[20]; char sex; int age; float score; char addr[30...
  • C语言结构体(struct)最全的讲解(万字干货)

    万次阅读 多人点赞 2020-02-15 13:16:22
    结构体的定义 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。 结构体和其他类型基础数据类型...由于C语言无法操作数据库,所以在项目中通过对结构体内部变量的操作将大量...
  • c语言结构体与共同体语言结构体与共同体第八章 结构体与共用体 【教学要求】 1.理解结构体的含义。 2.掌握结构体类型变量的定义方法。 3.掌握结构体类型变量的引用方法。 4.掌握结构体类型变量如何在定义的同时...
  • 《数据结构:C语言结构体与指针》实验报告学生姓名学生班级学生学号指导老师实验内容:1) 学生信息的显示,具体要求如下:???定义一个结构体描述学生信息(学号,姓名,性别,年龄,住址);???设计一个函数,用于显示...
  • C语言结构体定义

    千次阅读 多人点赞 2018-08-29 16:52:36
    C语言结构体定义在我看来类似数据库的表 如: #include &lt;stdio.h&gt; #include &lt;string.h&gt;   struct st1 {  int id;  char name[30];  char sex;  int score; };     ...
  • 结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针。html指向结构体变量的指针前面咱们经过“结构体变量名.成员名”的方式引用结构体变量中的成员,除了这种方法以外还能够使用指针。前面讲过,&...
  • 结构体数组赋值问题我在使用结构体数组的时候遇到这个问题,想了好长时间也没弄明白其中的原因,程序如下:main(){struct abc{char name;int a;float b;};struct abc stu[3];int i;printf("please input:\n");for(i=...
  • 结构体与链表11.1 结构体类型的定义结构体是由C语言中的基本数据类型构成的、并用一个标识符来命名的各种变量的组合,其中可以使用不同的数据类型。结构体类型的定义Struct结构体名{类型标识符1 成员名1;类型标识符...
  • c语言结构体

    2018-07-03 09:36:40
    关于c语言结构体的引入; 在前面已经介绍了整形(int,long,….),浮点型(flaot,double),字符型(char),还介绍了数组(存储一组具有相同类型的数据),字符串。但是在实际问题中只有这些数据类型是不够的,...
  • C语言 结构体试题

    2020-08-03 18:37:41
    C语言 结构体试题 1、创建教师的结构体,教师信息包含工号,姓名,性别,部门,职称,月薪(5分) 2、添加以下 5 条教师信息:工号,姓名,性别,部门,职称,月薪(10 分) 工号 姓名 性别 部门 职称 月薪(元) ...
  • 概述定义结构体类型变量的方法结构体变量的引用结构体变量的初始化结构体数组指向结构体类型数据的指针用指针处理链表共用体枚举类型用 typedef定义类型概述定义一个结构体的一般形式:struct结构名 {成员列表};...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,205
精华内容 20,882
关键字:

c语言结构体输入

c语言 订阅