当前位置:首页 > 工业控制 > 电子设计自动化
[导读]摘要:本文简要分析结构体、联合体2种特殊的数据类型,结合链表和结构体的综合运用,详细注释创建链表的计算机执行和处理的过程,并对一些概念结合代码举例分析,指出常见错误和问题。结构体结构体是一种特殊的数据类

摘要:本文简要分析结构体、联合体2种特殊的数据类型,结合链表和结构体的综合运用,详细注释创建链表的计算机执行和处理的过程,并对一些概念结合代码举例分析,指出常见错误和问题。

结构体
结构体是一种特殊的数据类型,它可以将很多数据类型打包,然后只要操作该结构体的指针变量便可以轻松的访问该结构体内其他的数据。

举例如下:

struct student

{

char name[8];

int age;

char depart[20];

float grade;

}freshman ;

student是结构名,大括号内为该结构体打包的数据类型。如果定义 struct student *p=freshman.name,则引用变量p可以指向结构体*p的存储空间首地址。

①成员运算符“.”运行级别高于“*”,所以*p.name表示*(p.name)。

②定义结构体要在末尾加“;”。

例:简单的机构体赋值和应用

#include <stdio.h>

int main()

{ //定义一个结构体a;

struct student

{

char name[8];

int age;

char sex[4];

char depart[20];

float grade1,grade2,grade3;

}a;

printf("nName:"); //输入结构体a中的成员name,接着打印到终端

scanf("%s", a.name); 此处引用的方式是:结构体变量.成员名

printf("n%sn",a.name);

return 0;

}

例:定义结构体数组,调用结构体内数据

结构体数组的成员有三种访问方式:

①结构体变量.成员名

②(*结构体指针变量).成员名

③结构体指针变量->成员

#include <stdio.h>

struct stu //定义结构体数组及结构体的初始化

{

int num;

char *name;

char sex;

float score;

}pupil[5]={

{101,"Tom",'M',45.8},

{102,"Mike",'M',62.5},

{103,"Chris",'F',92.5},

{104,"Rose",'F',87.6},

{105,"Nate",'M',58.8}

};

void avg(struct stu *ps) //声明无返回值的函数avg,定义其参数是一个结构体指针变量。

{

int c=0,i; //定义两个整型c,i;

float ave,s=0; //定义两个浮点型变量ave,s

for(i=0;i<5;i++,ps++) // i表示循环的次数

{

s+=ps->score; //s表示学生成绩的和

if(ps->score<60) c+=1; //c表示不及格的学生数数目

}

printf("s=%.3fn",s); //打印学生成绩的和

ave=s/5; //ave计算学生的平均成绩

printf("average=%.3fncount=%dn",ave,c);

}

int main()

{

struct stu *ps; //定义结构体变量*ps 目的是在内存空间中取一个连续的栈空间,大小是sizeof( struct stu),并将内存的首地址赋值给ps

ps=pupil; //将pupil的地址赋值给ps 将ps的指向定位到具体的结构体数据头处,即给*ps赋值操作,将数据连续写入内存的栈空间中

avg(ps); //将ps赋值,调用函数avg

return 0; //返回mian函数开始执行处

}

结构体指针变量做函数参数的好处:直接减少压栈次数,效率比多次压栈效率高,调用方便。

链表与数组相比:
①链表的数据空间可以任意分配,而数组是一段连续的地址空间
②链表相比数组占用空间大
③链表方便对数据的搜索,删除和插入等

单向链表的创建:
每个节点包含了数据和一个指向下一个节点头的地址

data

pNext

data

pNext

data

pNext

data

NULL

head

例:函数实现:输入一个变量n就能够创建n个节点

struct stu

{

int age;

int num;

struct stu *next;

};

struct stu *creat(int num) //假设将要创建的个数,返回一个结构指针

{

struct stu *head,*pf,*pb;

int n;

for(n=1;n<=num;n++)

{

printf(“please input the %d student’s age and num info:n”n);

pb=(struct stu *)malloc(sizeof(struct stu));//在内存中申请一个大小为 struct stu块空间,并将pb指向这个内存,每次都在指向的内存中的头字节

scanf(“%d %d”,&pb->age,&pb->num); //给内存中输入第n个学生的信息

if(i==1)

head=pb; //第一个学生时,将块空间头指针赋值给head指针, head指向第一个节点,为了返回而不会发生变化

else

pf->next=pb; //其他学生时,将pb赋值给前个空间内的节点指针空间,pf表示的是上一个节点的头指针

pb->next=NULL; //将申请的内存块内的指针变量next赋值为空

pf=pb; //将头指针赋值给pf,和上一个pf的操作综合看来pf指针其实是个交换地址的中间变量

}

return (head); //返回第一个节点的地址

}

计算机中的函数类比数学中的函数:对应于数学中的函数Y=F(X),计算机中的参数和X表示同一种变量,返回值可以类比于Y,我们平时编程序的核心就是实现F的功能。

计算机中和数学中唯一不相同的一点是,计算机更加注重数据的格式,以及返回值类型等,这个源于计算机是二进制数表示形式和硬件性能的有限性。

另外C语言的函数指针和结构体指针等概念将函数的自变量的概念和原理发挥到极点。

联合体

例:定义一个联合体

#include <stdio.h>

int main()

{

union{ //定义联合体变量number

int i;

struct{

char first;

char second;

}half;

}number;

number.i=0x4241; //给联合体变量number.i赋值

printf("%c%cn", number.half.first, number.half.second);

number.half.first='a'; //联合体引用:联合体变量名.成员名

number.half.second='b';

printf("%xn", number.i);

return 0;

}

注意:
1,联合体是共享内存的,若需要改变结构体half的值,可以通过改变联合体内部i的值来改变;
2,X86存储方式为小端模式,高位存低位,低位存高位。

四字节对齐

struct stu1

{

char name; //name字符占1个字节,age占4字节,name和age对齐

int age;

};

struct stu2

{

char name[2]; //name数组占2个字节,age占4字节,name和age对齐

int age;

};

struct stu3

{

char *name; //*name地址占4个字节,age占4字节,name和age对齐

int age;

};

对于这3个结构体所占用的内存空间是8个字节,因为4字节对齐要求

gcc BUG:

在编译函数尾‘}’后边没有空行的文件提示警告信息:warning: no new line at end of file

处理方法:最后一行加个回车



来源:miaomi1次

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

电解电容和普通电容是两种不同类型的电容器,它们在结构、工作原理和使用场合等方面存在明显的差异。本文将详细介绍电解电容和普通电容的区别,帮助读者更好地了解这两种电容器。

关键字: 电解电容 普通电容 结构

整流变压器整流变压器是整流设备的电源变压器。整流设备的特点是原方输入电流,而副方通过整流原件后输出直流。整流变压器和普通变压器的原理相同。变压器是根据电磁感应原理制成的一种变换交流电压的设备。变压器一般有初线和次级两个互...

关键字: 整流变压器 电流 结构

变压器是一种能量转换装置,是一种相对可靠的电气设备,但其一旦发生故障影响十分巨大,它牵涉到用户停电和花费较大的修理费用且修理时间也较长。了解变压器的结构,对于分析变压器的故障有很大的帮助作用。电力变压器是根据电磁感应原理...

关键字: 变压器 结构 电能

变配电运行中,变压器必不可少,熟悉和掌握变压器的基本常识是非常有必要的,变压器的基本知识储备是每一个电力人必备的技能!在交流电路中,将电压升高或降低的设备叫变压器,变压器能把任一数值的电压转变成频率相同的我们所需的电压值...

关键字: 变压器 交流电压 结构

直流电机(direct current machine)是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。

关键字: 直流 电机 结构

摘要:由于智能制造行业的发展需求,无人机的用途在无限扩大,同时也对无人机自主导航提出了极高的要求,以减少人为操作的干预。实现无人机姿态追踪功能是无人机自主导航的重要途径,而实现良好的无人机姿态追踪,不仅仅需要建立出色的姿...

关键字: 无人机 姿态追踪 结构

摘要:介绍了160km/h快运货车转向架的主要技术参数、主要结构、主要零部件试验情况及技术特点,为其他形式的快运货车转向架研究提供了借鉴。

关键字: 结构 试验 技术参数

嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分,通常嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板,事实上所有带有数字接口的设备,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整...

关键字: 嵌入式 语言 技术

近年来,传统的基于结构(structure-based)的设计方法已经逐渐达到其极限,使得用于药物研究和发现的资本开支呈指数级增长。因而,对于药物设计领域来说,基于运动( motion-based)的药物设计方案,即分子...

关键字: 雪湖科技 结构 药物设计

语音编码器的主要功能就是把用户语音的PCM(脉冲编码调制)样值编码成少量的比特(帧)。这种方法使得语音在连路产生误码、网络抖动和突发传输时具有健壮性(Robustness)。在接收端,语音帧先被误码为PCM语音样值,然后...

关键字: 语音编码器 PCM 语言
关闭
关闭