瘋子C语言笔记(结构体/共用体/枚举篇)

(一)结构体类型

1.简介:

例:

struct date

{

int month;

int day;

int year;

};

struct student

{

int num;

char name[20];

char sex;

int age;

struct date birthday;  /*birthday 是 struct date 类型*/

char addr[30];

}student1,student2;

(1):结构体可嵌套

(2):与枚举相比结构体内元素为变量,而枚举为常量

(3):元素只能单个引用:如:student.num;  student.birthday.month;

(4):内部元素变量可以与其他变量重名且互不影响;

(5):赋值:student.num = 10010;

2.初始化

(可直接赋值)

struct student

{

long int num;

char name[20];

char sex;

char addr[20];

}a = {10101,"Li Lin","M","BeiJing Road"};

3.结构体数组

struct student

{

int num;

char name[20];

char sex;

int age;

struct date birthday;  /*birthday 是 struct date 类型*/

char addr[30];

};

struct student stu[3];

注:数组中每一个元素都是一个结构体类型数据;

4.指向结构体类型数据的指针

struct student

{

int num;

char name[20];

char sex;

int age;

struct date birthday;  /*birthday 是 struct date 类型*/

char addr[30];

};

struct student stu_1;

struct student *p;

p = &stu_1;

注:

(1)一个结构体变量的指针就是该变量所占据的内存段的起始地址(开头地址);

(2)(*p).num 等价于 stu_1.num;(*p两端的括号不能省略)

(3)(*p).num 等价于 p->num; (-> 称为指向运算符)

(4)如下运算

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

p->n ++;得到p指向的结构体变量中的成员n的值,用完该值后使它加1。

++ p->n;得到p指向的结构体变量中的成员n的值加1,然后再使用它。

-> 运算优先级大于 ++;

5.指向结构体数组元素的指针

struct student

{

int num;

char name[20];

char sex;

int age;

struct date birthday;  /*birthday 是 struct date 类型*/

char addr[30];

};

struct student stu[3];

struct student *p;

for( p = stu;p < stu + 3;p ++)

printf( "%5d %-20s %2c %4d\n",p->num,p->name,p->sex,p->age);

注:p是一个指向struct student 类型数据的指针变量,它用来指向一个struct student 类型的数据(及:stu数组的一个元素如stu[0],stu[1],的起始地址),不应用来指向stu数组元素中的某一成员,

p = stu[1].name;   这样的用法是错误的

但是:

强制类型转换后可以用

p = (struct student *)stu[0].name;  这样是正确的;

这样的话:p的值是stu[0]元素的name成员的起始地址。printf(“%s”,p)输出stu[0]中成员name的值。但printf(“%s”,p +1)则输出 stu[1]中name的值。p+1 的值是在p值的基础上加上结构体struct student的字节长度。

因为:p加减运算他的类型就是他的最小运算单元

6.结构体变量做函数参数

注:用结构体变量做函数参数时,采用值传递的方式,将结构体变量所占的内存单元的内容全部顺序传递给形参。

#include

#include

#define FORMAT "%d\n%s\n%f\n%f\n%d\n"

struct student

{

int num;

char name[20];

float score[3];

} ;

void main()

{

void print(struct student);

struct student stu;

stu.num = 12345;

strcpy(stu.name,"Li Li");

stu.score[0] = 67.5;

stu.score[1] = 89;

stu.score[2] = 78.6;

print(stu);

}

void print(struct student stu)

{

printf(FORMAT,stu.num,stu.name,stu.score[0], stu.score[1],stu.score[2]);

printf("\n");

}

运行结果:

12345

Li Li

67.500000

89.000000

78.599998

7.用指针处理链表

例:

#include

#define NULL 0

struct student

{

long num;

float score;

struct student *next;

};

void main()

{

struct student a,b,c,*head,*p;

a.num = 10101;a.score = 89.5;

c.num = 10103;c.score = 90;

c.num = 10107;c.score = 85;

head = &a;

a.next = &b;

b.next = &c;

c.next = NULL;

p = head;

do

{

printf("%ld%5.1f\n",p -> num,p -> score);

p = p -> next;    //使P指向下一结点

}

while(p != NULL);

}

运行结果:

10101  89.5

10103  90.0

10107  85.0

注:

该例子结点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为“静态链表”。

8.处理动态链表

①malloc函数

原型:void *malloc(unsigned int size)

其作用是在内存的动态存储区分配一个长度为size的连续空间。此函数的值(即“返回值”)是一个分配域的起始地址(类型为void)。如果此函数未能成功地执行(例如内存不足),则返回空指针(NULL)。

②calloc函数

原型:void *malloc(unsigned n unsigned int size);

其作用是在内存的动态存储区分配n个长度为size的连续空间。函数返回一个指向分配域起始位置的指针;如果分配不成功,返回NULL;

③free函数

原型:void free (void *p);

其作用是释放由p指向的动态存储区,使这部分内存区能被其他变量使用。p是最近一次调用calloc或malloc函数时返回的值。free函数无返回值。

9.建立动态链表

(二)共用体

1.概述:使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构;

2.定义

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;

注:共用体与结构体定义形式相似,但占内存不同,结构体占的是各个成员内存和,共用体的内存是成员中字节最长的那个;

3.共用体变量的引用方式

必须先定义后引用,引用时只能引用共用体变量中的成员。

如:

a.i

a.ch

a.f

4.共用体类型数据的特点

(1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。所以对于共用体变量中起作用的成员是最后一次存放的成员。

如:

a.i = 1;

a.c = 'a';

a.f = 1.5;

只有a.f 是有效的,a.i ,a.c已经无意义了,此时用"printf("%d",a);"是不行的,"printf("%d",a.i);"是不行的,"printf("%d",a.f);"可以;

(2)共用体变量的地址、它的各成员的地址都是同一地址。

即:&a, &a.i, &a.c, &a.f都是同一地址;

(3)不能对共用体变量名赋值,不能赋值给共用体名,不能定义共用体时对它初始化。

union data

{

int i;

char ch;

float f;

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

a = 1;        错误

m =a;        错误

(4)不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针(和结构体变量这种用法相仿)。

(5)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。

(三)枚举类型

1.enum weekday{sum,mon,tue,wed,thu,fri,sat};(枚举定义的量都为常量)

声明一个枚举类型 enum weekday,可以用此类型来定义变量。如:

enum weekday workday,week_end;

workday和week_end被定义为枚举变量,它们的值只能是sum到sat之一。如:

workday = mon;

week_end = sum;

等价于

enum {sum,mon,tue,wed,thu,fri,sat} workday,week_end;

它们都是其中之一。

2.当然可以用

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

即等价于 enum weekday{sum,mon,tue,wed,thu,fri,sat};

3.枚举类型特点

(1)枚举元素作为常量,它们是有值的,C语言编译按定义时的顺序使它们的值为 0,1,2.....

在上面定义中,sun的值为0,mon的值为1......sat的值为6。

例如:

printf("%d",workday);

将输出整数 1。

可以在定义式对元素赋初值

如:

enum weekday {sum =7,mon =1,tue,wed,thu,fri,sat}  workday,week_end;

定义sun为7,mon为1,其他值还是按顺序给值,即sat任为6。

③枚举类值可比较大小做判断。

(2)一个整数不能直接赋给一个枚举变量

如:

workday = 2;    错误

但可

workday = (eunm weekday)2;    正确

c语言指针变量输出不了共用体,瘋子C语言札记(结构体/共用体/枚举篇)相关推荐

  1. 动态二维数组外圈元素值的和_C语言 | 用指向元素的指针变量输出二维数组元素的值...

    例33:有一个3*4的二维数组,要求用C语言实现指向元素的指针变量输出二维数组个元素的值. 解题思路:二维数组的元素时整型的,它相当于整型变量,可以用int*型指针变量指向它.二维数组的元素在内存中是 ...

  2. C语言学习之有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值

    有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值. int main(){int a[3][4];int i,j,*p;//p是 int *型指针变量printf("请 ...

  3. C语言学习之通过指针变量输出整型数组a的10个元素

    通过指针变量输出整型数组a的10个元素 int main(){int a[10],i,*p=a;//p的初值是a,p指向a[0] for(i=0;i<10;i++){scanf("%d ...

  4. 【c语言】用指针变量输出一维数组中的数据

    #include<stdio.h> void main(){     int i,*m,a[5];     printf("数组:"); //普通方式输出数组的元素   ...

  5. c语言两个指针变量不可以,2.C语言指针变量

    # 2.C语言指针变量 变量的指针就是变量的地址.存放变量地址的变量是指针变量.即在C语言中,允许用一个变量来存放指针,这种变量称为指针变量.因此,一个指针变量的值就是某个变量的地址或称为某变量的指针 ...

  6. C语言指针变量的使用

    C语言指针变量的定义和使用(精华) < 1分钟彻底理解指针的概念C语言指针变量的运算 > C语言中文网推出辅导班啦,包括「C语言辅导班.C++辅导班.算法/数据结构辅导班」,全部都是一对一 ...

  7. C语言指针变量的运算

    前言 指针变量也是可以进行运算的,如指针变量对其自身加上某个整数或减去某个整数,这在内存上体现为:相对这个指针向后偏移多少个单位或向前偏移了多少个单位,这里的单位与指针变量的类型有关.在32bit环境 ...

  8. c语言通过指针变量输出10个元素,C语言程序设计第2版指针程序设计(10页)-原创力文档...

    C 语言程序设计 - 理论方法与实践(第 2 版) 7.4.1 简单指针变量作函数参数 例 7-9 用比较交换法 ,将一维数组的最 大值移到数组的最 末元素位置,交换 过程用上述 swap() 函数实 ...

  9. C语言指针变量--图示易懂

    1. 指针是什么 如果在程序中定义了一个变量,在对程序进行编译时,系统就会给该变量分配内存单元,编译系统根据程序中定义的变量类型,分配一定长度的空间. 内存区的每一个字节有一个编号,这就是" ...

最新文章

  1. 文件系统的两种文件索引模式extent和blockmap
  2. 看了这一篇,就不用看别的——Java中Object关于锁的的三个方法:wait,notify,notifyAll的作用
  3. 看到腾讯反驳360的文章,笑死我了。
  4. 【分享】java反射获取、设置、打印对象属性,对象转map基础工具
  5. TIMING_03 时序分析原理
  6. vue 直接访问静态图片_vue中本地静态图片路径写法
  7. python脚本转换成apk_apktool反编译apk并回编译
  8. 压力管道流量计算公式_这个非常重要!水处理常用计算公式汇总
  9. atom芯片和服务器芯片冲突,大小核混合X86可否在笔记本市场与Arm一战?英特尔Atom再昂首先前...
  10. Python03 拉格朗日插值法 牛顿插值法(附代码)
  11. L - Farm Irrigation (并查集
  12. 【原创】在Windows 环境下利用SVN和Apache以及Ankh配置源代码管理服务
  13. java 学习资料 分享
  14. 苹果手机清灰_手机听筒喇叭声音越来越小?来试试这三个小技巧
  15. 基于linkboy+GD32编程实现多种屏幕显示效果(LCD1602、LCD12864、彩屏)
  16. 【冬瓜哥归来】传统存储老矣,新兴存储能当大任否?
  17. 求大神帮帮我,万分感谢,源码运行需要时间段,帮帮忙哈……
  18. Mirobiome | 广东省科学院土壤所孙蔚旻团队:固氮内生菌可以提高中国芒草的生态适应性...
  19. iOS - 常用的iOS Mac框架和库以及常用的中文开发博客
  20. 把Redis当作队列来用,真的合适吗

热门文章

  1. 小马哥---高仿苹果7p 9900-875AQ0-A-6571新版刷机拆机图示与识别图
  2. 谷歌浏览器开发者工具的使用详解
  3. yolov7使用onnx推理(带不带NMS)
  4. python 引用局部变量_在Python中赋值之前引用的局部变量?
  5. Linux系统编程【5】——stty的学习
  6. 【思考】如何写好测试报告
  7. JSP写提示框、警告框、确认框
  8. 单一职责原则(拆分职责)
  9. 驰音车主服务终端开启大数据时代“汽车+音乐”服务新模式
  10. GitHub 上 window版本的Redis-x64-3.2.100.zip 下载没网速 以及安装