结构体
1.c语言允许用户自己建立由不同数据组成的组合型的数据结构,它称为结构体。在其他一些高级语言中称为“记录”。
2.定义结构体的一般形式

struct 结构体标记 //struct+结构体标记  即结构体的类型名
{成员表列
}变量表列;

注意:结构体可以定义在函数外部或者内部。结构体标记和变量至少有一种。如果有变量,可以进行初始化。
3.建立一个结构体类型,它只相当于一个模型,其中没有具体数据,系统也不为其分配存储单元。—―相当于设计好了图纸,但没有建成具体的房屋。

结构体定义和初始化

#include<stdio.h>
//结构体定义总结:结构体标记和变量至少有一种。如果有变量,可以进行初始化。
struct Student{         //1.定义时为结构体起一个结构体标记名 char name[30];int age;double score;
};
struct Student2{            //2.定义时为结构体起一个结构体标记名 并定义这种数据类型的变量 char name[30];int age;double score;
}A,*p;
struct Student3{            //3.定义时为结构体起一个结构体标记名 并定义这种数据类型的变量 并为变量进行初始化 char name[30];int age;double score;
}A1 = {"zhangsan",20},*p1;
struct{                     //4.只定义结构体类型的变量 char name[30];int age;double score;
}A2,*p3;
void f(void);
int main(void){ //f();struct Student a = {"zhangsan",20,98.5};   //1.完全初始化 struct Student b = {"zhangsan",20};            //2.不完全初始化,未被赋值的成员将有一个默认值0 struct Student c = a;                        //3.定义结构体变量时,使用其他的结构体变量完成初始化 //struct Student d = {.score = 18.5};     //4.C99编译器的新功能:在定义一个结构体变量的时候对某个成员初始化,这里会报错 printf("学生的姓名:%s, 年龄:%d, 成绩:%lf\n",a.name,a.age,a.score);printf("学生的姓名:%s, 年龄:%d, 成绩:%lf\n",b.name,b.age,b.score);printf("学生的姓名:%s, 年龄:%d, 成绩:%lf\n",c.name,c.age,c.score);printf("学生的姓名:%s, 年龄:%d, 成绩:%lf\n",d.name,d.age,d.score);return 0;
}
void f(void){struct Student a;printf("请输入学生的姓名,年龄和成绩:\n");scanf("%s%d%lf",a.name,&a.age,&a.score);printf("学生的姓名:%s,  年龄:%d, 成绩:%lf\n",a.name,a.age,a.score);  //1.可以通过 变量名.成员名 的方式访问一个结构体变量的成员 struct Student *p=&a;printf("学生的姓名:%s,    年龄:%d, 成绩:%lf\n",p->name,p->age,p->score);  //2.可以通过 指针->成员名 的方式访问一个结构体变量的成员
}

结构体变量所占字节长度

#include<stdio.h>
int main(void){//字节对齐,各种数据类型是按照一定的规则在内存当中排列的 short a;int b;double c;printf("%d,%d,%d\n",(int)&a%2,(int)&b%4,(int)&c%8);//0,0,0     基本数据类型变量的地址是能够被它们所占字节的长度所整除的 struct Stu1{char a;short b;};struct Stu2{char a;int b;};struct Stu1 A;struct Stu2 B;printf("%d,%d\n",(int)&A%2,(int)&B%4);   //0,0       1.结构体变量的首地址能够被其最宽基本类型成员的大小所整除printf("%d,%d\n",sizeof(A),sizeof(B));   //4,8       2.结构体成员相对于结构体变量的首地址的偏移量(结构体变量的地址编号和结构体成员的地址编号所差的字节数)都是其成员大小的整数倍printf("%d,%d\n",((int)&A.b-(int)&A)%2,((int)&B.b-(int)&B)%4);  //0,0struct Stu3{char a;double f;int b;}C;printf("%d\n",sizeof(C));   //24        3.结构体的总大小为结构体最宽基本类型成员的整数倍 struct Stu4{char a;struct Stu2 b;}D;/*D中最宽的基本类型成员是D.b.b 长度为4个字节,所以1.D的首地址必须被4整除2.D的长度必须被4整除struct Stu2数据类型可知:1.D.b的地址能够被4整除2.D.b的长度是8*/printf("%d\n",sizeof(D)); //12    2【特殊】.如果结构体成员是复合数据类型的,那么它相对于结构体首地址的偏移量,应该是其最宽基本类型成员大小的整数倍return 0;
}

结构体数组和指针
输入n个学生的姓名和成绩并按成绩排序输出

#include<stdio.h>
#define N 4
struct Stu{char name[30];double score;
};
void input(struct Stu *p,int len){for(int i=0;i<len;++i){printf("请输入第%d个学生的姓名和成绩:\n",i+1);scanf("%s%lf",p[i].name,&p[i].score);}
}
void show(struct Stu *p,int len){for(int i=0;i<len;++i){printf("第%d个学生的姓名:%s,成绩:%lf\n",i+1,p[i].name,p[i].score);}
}
void sort(struct Stu *p,int len){for(int i=0;i<len-1;++i){for(int j=0;j<len-1-i;++j){if(p[j].score>p[j+1].score){struct Stu b=p[j];p[j]=p[j+1];p[j+1]=b;}}}
}
int main(void){//struct Stu m[]={{"zhangsan",89.6},{"lisi",67},{"wangwu",23.5}};     //结构体数组定义时的初始化 //show(m,3);struct Stu a[N];input(a,N);sort(a,N);show(a,N);return 0;
}

复杂的数据类型
1.已知 int a[5]是定义一个含有5个整型元素的数组,那么如何理解 int(* p)[5]所代表的含义?我们把 int[5] 当成是一个数据类型,并设一个数据类型 A 和其等价,则 int a[5] 和 A a 等价。同理我们可以把 int(* p)[5]转化成 A* p。

因为 A 是一个含有5个整型元素数组类型,所以 A* 就代表是一个含有5个整型元素的数组的指针类型,那么 p 就是该类型的变量。

2.已知 int f(int) 是定义一个返回值是 int,形参为 int 的函数。那么如何理解 int (* p)(int) 所代表的含义?

我们把 int (int) 当成是一个数据类型,并设一个数据类型 A 和其等价,则 int f(int) 和 A f 等价。
同理我们可以把 int(* p)(int) 转化成 A* p。
因为 A 是一个返回值是 int,形参为 int 的函数类型,所以 A* 就是一个返回值是 int,形参为 int 的函数的指针类型,那么 p 就是该类型的变量。

结论:看变量所属圆括号的最外层,把最外层的数据类型设为一个新数据类型,然后去掉变量最外层的花括号。通过这种方法,直到原式转化成 “数据类型 变量” 的形式。

3.分析:int a[3][4] 中 a 的数据类型是什么?

(1)设数据类型 A 和 int[4] 等价,都是定义一个含有4个 int 的数组。则原式可以转化为:A a[3]。
(2)设数据类型 B 和 A[3] 等价,都是定义一个含有3个 A 的数组。则原式可以转化为 B a。 所以 a 是一个含有3个 A 的数组。
(3)又因为 A 是一个含有4个 int 的数组,所以 p 就是一个含有3个元素的数组,每个元素又是一个含有4个 int 的数组。

4.分析:int* (* (* p ) [10] )(void) 中 p 的数据类型是什么?

(1)设数据类型 A 和 int * (void) 等价,都是定义一个返回值为 int* ,形参为 void 型的函数。
则原式可以转换为A* (* p) [10]。
(2)设数据类型 B 和 A* [10] 等价,都是定义含有10个 A 的指针的数组。
则原式可以转换为 B* p。那么 p 就是一个含有10个 A 的指针的数组的指针。
(3)又因为 A 的数据类型是一个返回值为 int*,形参为 void 型的函数。 所以 p 就是一个含有10个(返回值为 int*,形参为 void 型的函数)的指针的数组的指针。
你也可以说 p 指向一个含有10个元素的数组,其中每个元素是一个返回值为 int* ,形参为 void 型的函数的指针。



用 typedef 声明新类型名
按照定义变量的方式,把变量名换上新类型名,并且在最前面加“typedef”,就声明了新类型名代表原来的类型。

#include<stdio.h>
typedef int Count;      //1.Count 就代表 int 类型
typedef int Num[3];     //2.Num 代表一个含有3个 int 型元素的数组类型
typedef struct{int a;double b;
}Stu;       //3.Stu代表一个结构体类型
#define INT int     //4.这里是定义了一个宏名INT,只是在预编译阶段进行一些简单的字符串替换
int main(void){Count a=3;      //1.定义一个 int 型变量 a printf("%d\n",a);//3Num b={1,2,3};        //2.定义了一个含有3个 int 型元素的数组 b printf("%d,%d,%d\n",b[0],b[1],b[2]);//1,2,3Stu m={12,45.6};       //3.定义了一个结构体类型变量 m printf("%d,%lf\n",m.a,m.b);//12,45.600000INT c=10;        //4.在预编译阶段 该句被替换为 int c=10; printf("%d\n",c);//10return 0;
}

单向动态链表
一般头结点不存放有效数据(当然你也可以根据情况而定),在其他节点存放有效数据。

共用体
(暂无整理)
枚举类型
(暂无整理)

C语言学习第九章——用户建立自己的数据类型相关推荐

  1. 计算机二级VB语言程序设计-第九章

    计算机- 最新全国计算机等级考试二级- 全国计算机等级考试二级- 全国计算机等级考试二级VB语言程序设计精讲班- 第九章-: 9.1Sub过程.flv 大小:120. M 9.2Funtion过程.f ...

  2. C++语言篇 第九章 自定义函数详解

    序言 一个 C++ 程序无论大小,都由一个或者多个函数组成,而且其中必须有且只有一个函数main(),称之为"主函数". 由函数 main()调用其他函数来完成程序的特定功能.当然 ...

  3. 【C语言】第九章 复杂数据类型与结构体 题解

    第九章 复杂数据类型与结构体 1.略 2.略 3.略 4.代码如下: #include <stdio.h>struct teacher {int card_id;char name[20] ...

  4. R语言实战-第九章 R in action-chapter9

    #第九章方差分析 #需要的packages:car gplots HH rrcov multicomp effects MASS mvotlier #单因素方差分析 #数据集来源multcomp包的c ...

  5. 第九章 用户自己建立数据类型

    一. 1.结构体(structure) :用户自己建立的由不同类型数据组成的组合型数据结构 注意: 1>结构体类型并非只有-种,而是可以根据需要设计出许多种结构体类型,各自包含不同的成员, 2& ...

  6. Android群英传学习——第九章、Android系统信息与安全机制

    1.Android系统信息获取 1.1 android.os.Build android.os.Build类里面的信息非常丰富,它包含了系统编译时的大量设备.配置信息,下面列举了一些常用的信息: ● ...

  7. java 为什么违例差错控制_JAVA编程思想学习 — 第九章 (违例差错控制)

    1.违例自变量 和 Java 的其他任何对象一样, 需要用 new 在内存堆里创建违例,并需调用一个构建器.在所有标准违例中,存在着两个构建器: 第一个是默认构建器,第二个则需使用一个字串自变量,使我 ...

  8. cla c 语言编译器,第九章 CLA_C2000_C_Compiler.pdf

    TI CLA C 编译器 概述 C2000 Compiler Roadmap CGT v6.2 CGT v6.1 Production CGT v6.0 Early Adopter In Develo ...

  9. C++PrimerPlus学习——第九章编程练习

    前两天有事情去了,没有好好学,之后要补回来 9-1 main.cpp #include <string.h> #include <iostream> #include" ...

最新文章

  1. sqlserver定时差异备份_一分钟看懂完全备份、差异备份以及增量备份
  2. 02-VTK编译安装
  3. Arch Linux 指南——安装基本系统
  4. apache php 调优_记一次apache+php调优
  5. 用JAVASCRIPT实现静态对象、静态方法和静态属性
  6. 文巾解题 176. 第二高的薪水
  7. python类加载器_利用Python反序列化运行加载器实现免杀
  8. 字符编码:ASCII,Unicode(UTF-8)
  9. 控制器局域网can总线
  10. 程序员面试金典 - 面试题 05.01. 插入(位运算)
  11. SSM:出现Connections could not be acquired from the underlying database异常的解决
  12. 关于使用Kaptcha验证码框架遇到的问题
  13. HiJson工具(查看Json)
  14. 附和导线平差程序(by C#)
  15. via浏览器下载路径_via浏览器
  16. 美国计算机专业硕士好申请学校,美国计算机硕士申请难度大PK
  17. 深入理解计算机系统arch lab
  18. 【建议收藏】15755字,讲透MySQL性能优化(包含MySQL架构、存储引擎、调优工具、SQL、索引、建议等等)
  19. 数蛙科技百亿级物流标签轨迹时序数据压测
  20. 关于Linux下Docker内网离线安装的一些笔记

热门文章

  1. 411 Length Required
  2. Java排序算法汇总
  3. win10录屏快捷键是什么?录屏快捷键怎么设置
  4. php滚动加载分页,jQuery scroll事件实现监控滚动条分页实例详解
  5. 我的世界服务器租服_mc租服务器要多少钱
  6. 炸燃!《英雄联盟手游》反向跳票!十一大免费福利攻略!不限号不删档全面开启公测!速度冲~!
  7. MySQL —— 函数
  8. QT Creator引用win32 api类库方法(.lib)
  9. @Deprecated注解的作用
  10. 从CPU与GPU利用率,到GPU与CPU差别的思考