谭浩强C语言第九章知识总结

article/2025/8/20 7:34:57

第九章

shyu 

结构体:用户自定义的数据类型

如:在描述一个学生的相关信息时,需要整型变量来记录学号,字符数组来记录名字,等等,物品们可以通过定义结构体改变变量的数据类型,把这些信息整成一个变量

struct student 是类型,不是变量名,定义结构体变量的一般形式: struct 结构体名{成员表列};其中,对各个成员都要进行类型说明,成员名的命名规则与变量相同。

声明的一般形式:

Struct 结构名{

成员1的说明;

成员2的说明;

。。。。。。

成员n的说明;

}

也可以用宏来定义:

#define  stu struct student

Stu{

成员1的说明;

成员2的说明;

。。。。。。

成员n的说明;

};

结构体变量的定义方法:

  1. 先定义结构体类型,在定义变量的名

struct student

{ int num;

 char name [20];

 char sex;

 int age ;

};

struct student student1,student2;

这个意思是说,定义student1,student2;为struct student类型的变量

也可以用宏来帮助定义

  1. 在定义类型的时候定义变量

struct student

{ int num;

 char name [20];

 char sex;

 int age ;

} student1,student2;

一般形式就是:

struct  结构体名

        {

          成员表列

        }变量名表列;

  1. 直接定义结构体类型的变量:

一般形式就是:

struct

     {

       成员表列

     }变量名表列;(此时不出现结构体名)

结构体变量的存储,一个结构体变量所占的字节数可以用sizeof运算符求出,一般形式就是:sizeof(变量名或者是类型标识符);

几点说明:

  1. 类型与变量的概念不要混淆,
  2. 结构体当中的成员也可以单独使用,作用和地位相当于普通变量;
  3. 成员也可以是一个结构体变量;
  4. 成员名可以与程序当中的变量名相同,但是二者不代表同一对象。

结构体变量的引用:

  1. 不能将一个结构体变量作为一个整体进行赋值和输出,只能对各个成员分别进行输出(引用形式为:结构体变量名.成员名),
  2. 若成员又是一个结构体变量,那么就只能对最低级的成员进行赋值或存取以及计算
  3. 成员变量可以和普通变量一样进行一系列的运算,
  4. 可以引用成员的地址,也可以引用结构体变量的地址

scanf(“%d”,&student1.num);就是输入student1.num的值

结构体变量的初始化:

对外部存储类型的结构体变量初始化:

struct  student

{long int num;

  char name[20];

  char sex;

  char addr[20];

} a={9801,”Wang hong”,’W’,”2 Linggong Road”};

main( )

{printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,a.num,a.name,a.sex,a.addr);

}

结构体数组

每个数组元素都是一个结构体类型的数据

定义方式:

struct  student                struct student          struct

{int num;                      {int num;              {int num;

  char name[20];                  …                  …

  char sex;                     } stu[3];               }stu[3];

  int age;

  char addr[30];

};

 struct studnt   stu[3];

结构体数组的初始化(只能对全局的或静态存储类别的数组初始化)

结构体数组的初始化的一般形式是在

定义数组后面加上:

={初值表列};

struct  student

{int num;

  char name[20];

  char sex;  int age;

  char addr[30];

} stu[3]={{111,”Li”,’M’,18,”Dalian”},{…},{…}};

也可采用:struct  student

           {int  num;

             …

            };

       struct student stu[]={{…},{…},{…}};

结构体指针

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

定义格式为:

struct 结构名

{结构体};

struct 结构名 变量名1,变量名2,……,变量名n,*指针变量名1,*指针变量名2,……,*指针变量名n;

指针变量名1=&变量名1;

指针变量名2=&变量名2;

……

指针变量名n=&变量名n;

不允许如下的定义指针变量:

struct 结构名 *指针变量名1=&变量名1 ;

结构体变量的指针,是该结构体所占内存端的首地址。

2.指针变量的引用:

引用结果结构体成员的三种方式:

    • 结构体变量名.成员名
    • (*p).成员名
    • P->成员名

->是指向运算符,运算优先级高于自增自减

试分析以下运算:

p->n        得到p指向的结构体变量中的成员n的值

p->n++     得到p指向的结构体变量中的成员n的值,

               用完后使它加1;

++p->n     得到p指向的结构体变量中的成员n的值

               使其先加1

结构体与函数

1.结构体作为函数参数
结构体作为函数参数有三种方法:

    • C语言允许结构变量成员作为函数参数
    • C语言允许用结构变量做函数的参数
    • 结构指针做函数参数

和普通变量一样,结构体变量作为函数参数,用于在函数之间传递数据。同时,函数的返回值也可以是结构变量。

 结构变量作函数参数的传递方式与简单变量作函数参数的处理方式完全相同,即采用值传递的方式,形参结构变量中各成员值的改变,对相应实参结构变量不产生任何影响,但在函数定义时需要对其类型进行相应的说明。如:

  int get_month(x)

 struct month x;

 {…

     x.day=25;

 …}

它说明了形参x是struct month型结构变量。

2.结构体类型的函数

结构体函数的一般定义形式为:

struct 结构类型名  函数名(形式参数列表)

{

函数体

}

其中,函数名func前面的类型说明符就是用于对函数返回值f的类型进行说明。

3.结构体指针型函数

当函数的返回值是结构体变量的首地址时,称该函数为结构体指针型函数,该函数的数据类型为结构体指针型例。如:

struct data *func(n)

float m;

{

struct data *f;

return(f);

}

结构体函数的一般定义形式为:

struct 结构类型名  *函数名(形式参数列表)

{

函数体

}

在调用结构体指针型函数时,用于接收结构体指针型函数返回值的变量应该是指向与该函数具有相同结构体类型的结构体指针变量。

结构体嵌套

如果一个结构成员是另一个结构体的成员变量,这种数据组织叫结构嵌套。

嵌套结构体变量的引用:

1、用成员运算符”.”

     s1[1].h.post             s1[1].birthday.year

2、用指针运算符“->”

     struct stu *ps;  ps=s1;

     ps-> h.post               ps-> birthday.year

用结构体指针操作链表

共用体:

使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。

“共用体”类型变量的定义形式为:

union   共用体名

    {成员表列

     }变量表列;

 例如:union  data

               {int i;

                 char  ch;

                 float  f;}a,b,c;

union  data

{int  i;

char  ch;

float  f;

};

union  data  a,b,c;

union

{int  i;

char  ch;

float  f;

} a,b,c;

注意:只能引用共用体变量中的成员,不能引用共用体变量本身。如:

可以引用

    a .i(引用共用体变量中的整型变量i)

    a .ch(引用共用体变量中的字符变量ch)

    a .f(引用共用体变量中的实型变量f)

不能只引用共用体变量,如:

printf(“%d”,a);

总之,和结构体非常相似,但也有所不同

结构体类型变量所占内存长度是各成员占的内存长度之和

共用体类型变量所占内存长度等于最长的成员的长度

共用体数据特点:

1.每一瞬时只有一个成员起作用 ;

2. 共用体变量中起作用的成员是最后一次存放的成员;

3.共用体变量的地址和它的各成员的地址都是同一地址;

4.不能对共用体变量名赋值,也不能企图引用变量名来得到成员的值,又不能在定义共用体变量时对它初始化。

5.  不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可使用指向共用体变量的指针;

6. 共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。而结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。

枚举类型:

若一个变量只有几种可能的值,可以定义为枚举类型。所谓“枚举”是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。

定义方法:

先定义枚举类型

 enum weekday {sun, mon, tue, wed, thu, fri, sat};

再用此类型定义变量,如:

enum weekday  workday, week_end;

或直接定义枚举变量。如:

enum weekday {sun, mon, tue, wed, thu, fri, sat}

                          workday,week_end;

几点说明:

1.枚举元素为常量,不是变量,故不能对它们赋值

2.枚举常量有值。如上面定义中,sun 、 mon 、 tue ······ sat的值依次为0、1、2······6

3.也可改变枚举元素的值,在定义时指出,如:

    enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat};

4.枚举值可用来作判断比较,如:

    if(workday==mon)         if(workday>sun)

5.一个整数不能直接赋值给一个枚举变量,应先进行强制类型转换才能赋值,如:

workday=(enum weekday)2;  (相当于将序号为2的枚举元素值赋给workday , 即:workday=tue;

typedef类型声明

C语言允许用typedef说明一种新的数据类型名,其一般形式为:

 typedef 类型名1 类型名2;

 其中,关键字typedef用于给已有类型重新定义新类型名,类型名1为系统提供的标准类型名或是已定义过的其他类型名;类型名2为用户自定义的新类型名。它往往可以简化程序中变量的类型定义。例如:

typedef int WORD;

定义WORD等价于数据类型int,此后,就可用WORD对变量进行类型说明,如:

WORD a,b,c,*pa;

实际上,C编译程序把上述变量作为一般的整型变量处理。在这种情况下,变量所表示的含义较为清楚,从而增加了程序的可读性。

就是说:后面的类型具有与前面的类型相同的意思

对typedef的几点使用说明如下:

(1)   typedef不能用于变量的定义,只能对已存在的类型增加新的类型名,而不能定义新的类型。

(2)   从表面上看,typedef与#define的使用方式十分相似,但两者本质上是不同。

例如:

    typedef int COUNT

    #define COUNT int

 typedef定义的是一种新的数据类型,类型名为COUNT,它是系统标准类型(int)的别名,在预编译时,编译器会将COUNT与int作为同一个类型来处理。

    #define定义的是一个宏,宏名为COUNT,在预编译时,编译器将进行宏替换,把字符串COUNT替换为字符串int。


http://chatgpt.dhexx.cn/article/iQdlXecL.shtml

相关文章

谭浩强C语言第七章知识总结

第七章 定义函数 定义没有参数的函数, 类型名 函数名() 类型名 函数名(void) { { 函数体 或 函数体 } …

C语言 谭浩强 题目 -第六章

文章目录 笔记字符数组字符数组输出字符串处理函数输入字符串的函数 gets()字符串连接函数--strcat字符串赋值函数--strcpy字符串比较函数---strcmp测字符串长度的函数--strlen转换为大小写的函数 EG 1EG 2EG 3 排序 冒泡排序 不用函数EG 4EG 5EG 6EG 7E…

C语言 谭浩强 题目 -第八章

文章目录 笔记通过指针引用数组用数组名作函数参数以变量名和数组名作为函数参数的比较 例题【例8.2】【例8.6】【例8.3】【例 8.4】【例 8.5】【例 8.6】【例8.7】【例8.8】【例8.9】【例 8.10】选择法起泡法 【例 8.11】【例 8.12】【例 8.13】【例8.30】 用指向数组的指针作…

C语言 谭浩强 题目 -第七章

文章目录 笔记函数参数函数调用返回值函数的嵌套函数的递归数组作为函数参数多维数组名作函数参数局部变量和全局变量全局变量 变量的存储方式和生存期自动变量(auto变量)static静态局部变量寄存器变量(register变量) 全局变量在一个文件内扩展外部变量的作用域将外部变量的作用…

【C语言】谭浩强

1.分支选择结构 #include<stdio.h> int main(){ char grade; scanf(“%c”,&grade); printf(“Your score:”); switch(grade) { case’A’:printf(“85~100\n”);break; case’B’:printf(“70~84\n”);break; case’C’:printf(“60~69\n”);break; case’D’:prin…

C语言 谭浩强第五版 课后习题解答

第一章 1.什么是程序?什么是程序设计? 程序&#xff1a;就是一组能识别和执行的指令&#xff0c;每一条指令使计算机执行特定的操作 程序设计&#xff1a;是指从确定任务到得到结果、写出文档的全过程 2.为什么需要计算机语言?高级语言有哪些特点? 为什么需要计算机语言&am…

谭浩强c语言课后习题(更新中)

1.第三章 纯代公式题 #include<stdio.h>int main() {float p1.07; //第一年倍数for (int i 1; i < 10; i) //只用循环了9次&#xff0c;因为是从第一年开始{p p * 1.07;}printf("%f%%%",p*100); }第2题也是代进公式即可 其实也是代给出的公式&#xff0…

C语言学习笔记(C程序设计-谭浩强)

入门&#xff1a; 计算机程序&#xff1a; 一组计算机能够识别和执行的指令。计算机的每一个操作都是根据指令进行的&#xff0c;计算机的一切操作都是由程序控制的 计算机指令&#xff1a;指挥机器工作的指示和命令。 指令包含操作码和操作数&#xff0c;操作码决定要完成的…

清风数学建模笔记--熵权法

是一种可以客观赋权的方法&#xff08;我们可以从数据中查看权重&#xff09; 依据的原理&#xff1a;指标的变异程度越小&#xff0c;所反映的信息量也越少&#xff0c;其对应的权值也应该越低。 本文借鉴了数学建模清风老师的课件与视频&#xff0c;如果大家发现文章中有不正…

c语言计算文本信息熵,C语言求信息熵,条件熵,联合熵

C语言求信息熵,条件熵,联合熵 (3页) 本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01; 11.90 积分 #include#include#define u 20int i,j,n,m;float H_X,H_Y,H_XY,H_XpY,Pypx[u][u],Px[u],H_YpX,Py[u],…

谭浩强C语言笔记

文章目录 谭浩强C语言笔记1.C语言基础知识1.常量和变量1.1入门程序1.2 常量1.2.1 整型常量1.2.2 实型&#xff08;浮点型&#xff09;常量1.2.3 字符常量1.2.4 字符串常量1.2.5 符号常量 1.3 变量1.4 常变量 2.标识符和关键字2.1 标识符2.2 关键字2.3 小习题 3. 基本数据类型3.…

天池比赛总结1

这次参加天池的一场比赛 先把数据读取了如下 接下来准备使用YOLO框出图片中的字符&#xff0c;然后进行识别

比赛总结+近期总结

比赛总结&#xff1a; 这次比赛没考好 20(没加高精度)0&#xff08;文件输出写错&#xff09;1000120 T1&#xff1a;这一题的方法是分解质因数高精度 T2&#xff1a;明显就是一道spfa的题嘛 T3&#xff1a;强大的四维DP&#xff08;我的神啊&#xff01;&#xff09; T4&#…

计算机课件比赛总结,课件制作比赛活动总结

【www.gz85.com - 投篮比赛活动工作总结】 课件制作比赛&#xff0c;是对计算机多媒体等辅助手段的一次检阅&#xff0c;也有力地促进了制作多媒体课件技艺的提高。下面是小编为您整理的“课件制作比赛活动总结”&#xff0c;仅供参考&#xff0c;希望您喜欢&#xff01;更多详…

2018年全国邀请赛(江苏) 比赛总结

先吐槽一下中矿大。。。周六在食堂吃的午饭&#xff0c;肉菜一个鱼一个辣土豆炒牛肉&#xff0c;对于对鱼过敏又感冒比较严重的我来说。。。&#xff08;然后再也没去食堂吃饭&#xff09; 南湖校区大是真大&#xff0c;风景也不错&#xff0c;就是门口离体育馆有点远。。。&a…

比赛总结

比赛总结 比赛总结-a5165.png 初赛终于结束了&#xff0c;头一次如此投入去打比赛&#xff0c;这一个多月以来真是痛并快乐着。最大的感悟是&#xff1a;构造线下验证集并没有什么用&#xff0c;做了一堆工作还不如一个leak。首先取得这个成绩算是给自己一个交代了&#xff0c;…

关于全国大学生软件测试大赛总结与反思

关于全国大学生软件测试大赛总结与反思 文章目录 一、软件测试大赛简介二、可能出现的错误三、个人总结与反思四、谈谈软件测试工程师1、测试的三个阶段2、就业优势3、就业要求4、参考薪资 一、软件测试大赛简介 由教育部软件工程专业教学指导委员会、全国高等院校计算机基础教…

【赛后总结】第十三届服务外包创新创业大赛总结——A14

目录 前言组队&#xff06;选题分工&项目推进提交材料&项目答辩区域赛初赛区域赛决赛全国总决赛 写在最后 前言 先摆两个参赛视频 初赛视频 决赛视频 比赛已经过去几个月了&#xff0c;也算是想起来这个比赛可以写一个总结了。在历时8个月左右的时间之后&#xff0c;我…

计算机大赛总结发言稿,学校技能比赛总结发言稿

学校技能比赛总结发言稿 总结就是把一个时间段取得的成绩、存在的问题及得到的经验和教训进行一次全面系统的总结的书面材料&#xff0c;写总结有利于我们学习和工作能力的提高&#xff0c;因此十分有必须要写一份总结哦。那么总结要注意有什么内容呢&#xff1f;以下是小编帮大…

计算机知识与技能比赛活动总结,中职技能大赛总结(精选6篇)

中职技能大赛总结(精选6篇) 总结是对取得的成绩、存在的问题及得到的经验和教训等方面情况进行评价与描述的一种书面材料&#xff0c;它能够使头脑更加清醒&#xff0c;目标更加明确&#xff0c;因此我们需要回头归纳&#xff0c;写一份总结了。那么你知道总结如何写吗&#xf…