当前位置:文档之家› 结构体

结构体

结构体
结构体

一、结构体的说明及变量的定义

1.结构体类型的说明

由于结构体类型不是C语言提供的标准类型,为了能够使用结构体类型,必须先说明结构体类型,描述构成结构体类型的数据项(也称成员),以及各成员的类型。其说明形式为:

struct结构体名

{

数据类型成员1;

数据类型成员n;

};

其中,struct是关键字,后面是结构体类型名,两者一起构成了结构体数据类型的标识符。结构体的所有成员都必须放在一对大括号之中,每个成员的形式为:

数据类型成员名;

同一结构体中不同的成员不能使用相同的名字,但不同结构体类型中的成员名可以相同。大括号后面的分号?;?不能省略。如:

struct person

{

char name[10];

char sex;

int age;

int stature;

};

这里定义了一个结构体类型 person,该类型由4个成员构成。

注意:

结构体类型说明中,只是描述该结构体类型的成员,说明了一种数据类型,并不分配空间。要使用说明的结构体类型,必须定义相应的变量,才会分配空间。

2.结构体变量的定义

结构体变量的定义有以下几种形式:

?结构体类型的说明与定义分开。例如说明了struct person之后,可以定义相应的变量:

struct person p1, p2;

定义了两个struct person变量,每个变量按结构类型中的成员分配相应的空间,

每一个结构体变量所分配空间为所有成员占用空间之和。如p1、p2所占用空间都为15byte。

?说明结构体类型的同时定义相应变量。如:

struct teacher

{

int number;

char name[10];

char sex;

char profession[6];

}t1, t2;

在说明struct teacher类型的同时,定义了相应的两个变量t1、t2。

?直接定义结构体变量,没有结构体类型名。如:

struct

{

int No;

char name[10];

char sex;

int age;

}s1, s2;

定义两个结构体变量s1、s2,他们都有4个成员,每个变量都占用15byte,但与第2种方式不同,没有给出结构体名,因而无法在其他地方再次使用该结构体类型定义别的变量。

3.结构体定义的嵌套

结构体类型的成员除了可以使用基本数据类型之外,还可以是其他类型,如上面例子中以数组作为成员。当然一个结构体类型的成员其类型也可以是另外一个结构体类型,这种结构体类型被称作结构体的嵌套。

如: struct date

{

int year;

int month;

int day;

};

struct student

{

int no;

char name[10];

char sex;

struct date birthday;

};

结构体struct student的成员birthday就是另外一个结构体struct date类型。

二、结构体变量的使用

对结构体变量的使用主要是指对各个成员的赋值,访问,及相关运算。

1.结构体变量的初始化

结构体变量和其他变量一样,在定义的同时可以给它们赋值,也就是对它们的成员赋值。如:

struct person p1={" zhangsan", 'T', 20, 170};

在初始化时,一般用一对大括号将各成员的初始值括起来,各个成员的初值列表要与类型声明中各成员的顺序和类型一致。对于嵌套定义的结构体变量初始化,也是用大括号将初值括起来。如:

struct student s1={35, " lisi",'F',1978,10,24};

也可以是: struct student s2={36, "wangwu",'T',{1980,2,3}};

2.结构体变量的使用

使用结构体变量时,一般都使用其成员,对成员的引用方式为:

结构体变量名.成员名

通过分量运算符?.?实现对成员的赋值、引用。

例9.1分析下面程序的运行结果。

struct person

{

char name[10];

char sex;

int age;

int stature;

};

main ( )

第二节结构体数组

结构体数组指的是数组中的每个元素都为同一结构体类型的数据。结构体数组与一般数组的定义相似,其格式为:

struct结构体名数组名[元素个数];

如: struct student s[3]; 定义了以一个struct student 类型的数组s,数组中有3个元素。

与一般数组一样,结构体数组可以初始化,对每个元素的初始化,按照结构体变量初始化方式进行。如:

struct student s[3]=

{21, "zhangsan", ' T', 1978, 10, 23,

35, "lisi", ' F', 1980, 2,3,

36, "wangwu", ' T',1978, 4, 5};

对于结构数组中各元素的引用与一般数组相同,通过下标的方式来引用每个元素,而每个元素的成员通过分量运算符?.?实现。如:s[1].name 、s[2].birthday.year等。

例9.3分析下面程序的运行结果。

#include

struct date

{

int year;

int month;

int day;

};

struct student

{

int no;

char name[10];

char sex;

struct date birthday;

};

main ( )

{

int i;

char sex[10];

struct student s[3];

for(i=0;i<3;i++)

{

printf("input No:"); scanf("%d",&s[i].no);

gets(sex);/*读掉输入学号后的字符及回车符,以便正确读入姓名*/

printf("input name:");gets(s[i].name);

printf("input sex:"); gets(sex);s[i].sex=sex[0];

printf("input year month and day:");

scanf("%d%d%d",&s[i].birthday.year, &s[i].birthday.month, &s[i].birthday.day);

}

for(i=0;i<3;i++)

printf("NO:%d,name:%s,sex:%c,year:%d,month:%d,day:%d\n",s[i].no,s[ i].name, s[i].sex,s[i].birthday.year,s[i].birthday.month,

s[i].birthday.day);

}

程序运行结果为:

input No: 1↙

input name: zhang san↙

input sex: f↙

input year,month and day: 1980 7 4↙

input No: 3↙

input name: lisi ↙

input sex: f↙

input year,month and day: 1982 7 8↙

input No: 4↙

input name: wang wu↙

input sex: m↙

input year,month and day: 1983 2 1↙

NO: 1, name: zhang san, sex: f, year: 1980,month: 7, day: 4

NO: 3, name: lisi, sex: m, year: 1982,month: 7, day: 8

NO: 4, name: wang wu, sex: m, year: 1983,month: 2, day: 1

程序中通过gets()函数代替scanf()实现字符串的输入,以避免输入时以空格作为字符串结束标志的问题。

第三节结构体类型的指针

由于一个结构体变量由多个成员构成,因而需要分配对应的一段连续空间来存放所有成员,成员占用空间的首地址作为该变量的指针。与数组相似,结构体变量名就代表该变量在内存中的首地址,是指针常量。当然也可以定义对应的结构体类型的指针变量来指向一个结构体变量。

一、结构体指针变量的定义

结构体指针变量的定义格式为:

struct结构体名 *指针变量名;

如: struct student *ps1,*ps2;

struct person *p1,*p2;

当一个结构体指针变量定义之后,可以用来指向结构体变量及结构体数组中的元素等。

如:

struct student s[4],s1;

struct student *ps1,*ps2;

ps1=&s1;

ps2=s

二、利用结构体指针变量对所指对象成员的引用

有两种方式实现引用:

?利用指针运算符?*?先得到所指对象,再使用分量运算符?.?实现:

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

例9.4 #include

#define N 3

struct person

{

char name[10];

char sex;

int age;

int stature;

};

main ( )

{

int i;

char sex[10];

struct person per[N], *p;

p=per;

printf("please input data:\n");

for(i=0;i

{

printf("input name:"); gets((*(p+i)).name);

printf("input sex:"); gets(sex); (*(p+i)).sex=sex[0];

printf("input age and stature:");

scanf("%d%d", &(*(p+i)).age, &(*(p+i)).stature );

getchar();/*读掉回车符,以便正确读入下一个姓名*/

}

printf("list of person:\n");

for(i=0;i

printf("name: %s, sex: %c, age: %d, stature: %d\n",

(*(p+i)).name, (*(p+i)).sex, (*(p+i)).age, (*(p+i)).stature);

}

程序运行结果为:

please input data:

input name: Li jun

input sex: f

input age and stature: 21 165

input name: Wang bo

input sex: m

input age and stature: 22 170

input name: Zhang san

input sex: f

input age and stature: 20 160

list of person:

name: Li jun, sex: f, age: 21, stature: 170

name: Wang bo, sex: m, age: 22, stature: 165

name: Zhang san, sex: f, age: 20, stature: 160

在程序实现数据输入的循环中,最后的语句:gets(sex)的目的是为了读掉输入age和stature之后剩下的空格及回车符,以便下一个人的信息读入。

注意:引用方式中的()不能省略,因为?〃?运算符的优先级高于?*?运算符。

?为了操作方便,C语言提供了指向运算符?->?,可直接引用所指向结构体变量的成员:

结构体指针变量->成员

如: p->name等价于 (*p).name

p->sex等价于 (*p).sex

p->age等价于 (*p).age等。

上面的例9.4改用指向运算符留给大家完成。

三、指向结构体自己的指针作为结构体成员的方式

结构体成员除了一般类型和其他结构体类型外,还可以是指针类型,特别是指向自己类型的指针。如:

struct link

{

int data;

struct link* pnext;

};

这种结构体类型一般用于构成链表。

第四节共用体

共用体也是一种结构造类型类型,将不同类型的数据组合在一起。但与结构体不同,在共用体内的不同变量占用同一段存储区,即在同一时刻,只有一个成员起作用。

一、共用体类型的声明及变量的定义

共用体类型的声明与结构体的声明完全相同,只是关键字为union。其一般格式为:

union共用体名

{

数据类型成员1;

数据类型成员n;

};

如: union data

{

int i;

char ch;

float f;

};

共用体变量的定义方式与结构体变量的定义方式相似,也有3种方式:

?类型定义与变量定义分开。如:

union data d1, d2;

?在定义类型的同时定义变量。如:

union data

{

int i;

char ch;

float f;

}x, y;

?直接定义共用体类型的变量,不给出共用体名。如:

union

{

int i;

char ch;

float f;

}x, y;

为共用体变量分配空间的大小是以所有成员中占用空间字节数最多的成员为标准。如上面例子中union data类型的变量分配空间为4byte。

二、共用体变量的使用

1.共用体变量的初始化

对于共用体变量,在定义的同时,可以初始化,但初始化只能对第一个成员初始化。如:

union data d1={10};

2.共用体变量中成员的引用

与结构体变量成员引用的方式相同,也使用?->?和?.?两种运算符来实现:共用体变量名.成员名

共用体指针变量名->成员名

如:union data d1, *pd;

pd=&d1;

对d1成员的引用可以是:d1.i或 pd->i

d1.ch或 pd->ch

d1.f或 pd->f 同类型的共用体变量之间可以互相赋值。如:

union data d1,d2={‘A’};

d1=d2;

例9.5分析下面程序运行结果。

union data

{

int i;

char ch;

float f;

};

struct data2

{

int i;

char ch;

float f;

};

main ( )

{

union data ud;

struct data2 sd;

ud.i=10; ud.ch= 'A'; ud.f=20;

sd.i=10; sd.ch= 'A'; sd.f=20;

printf(" size of ud: %d, size of sd: %d\n ",sizeof ud, sizeof sd);

printf("ud.i: %d, ud.ch: %c, ud.f: %f\n ",ud.i,ud.ch,ud.f);

printf("sd.i: %d, sd.ch: %c, sd.f: %f\n ",sd.i,sd.ch,sd.f);

}

运行结果为:

size of ud: 4,size of sd: 7

ud.i: 0, ud.ch: ,ud.f: 20.000000

sd.i: 10,sd.ch: A,sd.f: 20.000000

从上面的运行结果可看出,对共用体变量成员的赋值,保存的是最后的赋值,前面对其他成员的赋值均被覆盖;由于结构体变量的每个成员拥有不同的存储单元,因而不会出现这种情况。

本章小结

结构体类型是一种复杂而灵活的构造数据类型,它可以将多个相互关联但类型不同的数据项作为一个整体进行处理。在定义结构体变量时,每一个成员都要分配空间存放各自的数据。共用体是另一种构造数据类型,但在定义共用体变量时,只按占用空间最大的成员来分配空间,在同一时刻只能存放一个数据成员的值。本章重点:

1.结构体和共用体变量的定义都有三种形式,可以将类型的说明和变量的定义分开、结合或不给出类型名只定义变量。

2.结构体变量的初始化与赋值。结构体变量的初始化与数组相似,通过初值列表实现对变量中的成员初始化;赋值与数组也相似,只能逐个成员赋值。

3.结构体变量中的成员作为一个整体处理,成员的访问通过运算符?.?和?->?实现,其方式为:

结构体变量.成员名

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

4.共用体成员的访问方式与结构体相同,但只能对第一个成员初始化。当为一个成员赋值时,其他成员的值就会被覆盖掉。

结构体练习题

算并输出每个人的学号和平均成绩。 2.已知链表结点结构如下,假设动态链表已经建立,请编写删除给定学号的结点的函 数。(只编写删除子函数即可) 3.编写函数实现动态链表的建立。链表结点结构如下,要求在主函数中将你所建立的链 表输出到屏幕上。 4.有10个学生,每个学生的信息包括学号、姓名、3门课的成绩,从键盘输入10个学 生数据存入结构体数组中,要求输出个人总分最高的学生的信息(包括学号、姓名、3门课成绩、总分)。 5.链表的结点数据类型如下: struct node{ int data; struct node *next; }; 链表的建立和输出函数如下,编写将第i个结点删除的函数,并完善主函数,调试运行整个程序。 struct node *creat() { int x; struct node *h,*s,*r; h=(struct node *)malloc(sizeof(struct node)); r=h; scanf("%d",&x); while(x!=-1) { s=(struct node*)malloc(sizeof(struct node)); s->data=x; r->next=s; r=s; scanf("%d",&x); } r->next=NULL; return h; } void print(struct node *h) //打印函数 { struct node *p; p=h->next; if(p==NULL) printf("list is empty!"); else { while(p!=NULL) { printf("%4d",p->data); p=p->next; } } }

C语言自定义数据类型

自定义数据类型 结构体 结构体是程序员在程序中自定义的一种数据类型,在说明和使用之前必须先定义它,也就是构造它。定义一个结构体的语法格式如下: Struct 结构体类型名 { 成员1的数据类型名成员1名称; 成员2的数据类型名成员2名称; . . 成员n的数据类型名成员n名称; }结构体变量表={成员初始化}; 注意成员可以由若干个不同的数据类型组成,每个成员也可以是结构体,即可以嵌套定义。 例如: Struct student { Long num; Char name; Char sex; Float score; }; 已经定义的某种结构体类型可以视为一种标准的数据类型,它的使用方法与标准数据类型使用方法相同,可以用来定义变量、数组、指针。 结构体变量说明 结构体变量的说明在程序的变量说明部分给出,一般在结构定义之后,它的语法格式如下: Struct 结构类型名结构变量名表; 例如: Struct student stu; 指出了结构变量stu是student类型的变量,它由四个成员组成,每个成员的数据类型和名字都与student结构定义中给出的相同。系统完全按照结构定义时制定的内存模式为结构变量分配内存空间。 可以在定义结构体类型的同时给出结构体变量。 Struct student { Long num; Cha name[20]; Cha sex; Float score; }stu1,stu2; 这种形式与前面给出的结构定义和结构说明分开处理效果相同。

结构体成员访问 结构体成员是通过结构体变量名和成员名进行访问的,不能把他作为一个整体进行访问。其访问格式如下: 结构体变量名.成员名 其中运算符.是成员访问运算符,其运算级别是最高的,和圆括号运算符()、下标运算符[]是同一级别的。如果结构体成员是指针变量,则访问格式为: *https://www.doczj.com/doc/ab8188310.html, 如果某个结构体变量的成员数据类型又是一个结构体,则访问方式为: 外层结构体变量名.外层成员名.内层成员名 可以在定义结构体变量的同时对结构体变量初始化。 {结构体成员}结构体变量={初始数据}; struct student { long num; char name[20]; char sex; float score; } stu1={200401L,"ZhangHong",'f',92.5f}; 对于嵌套的结构体类型数据,访问格式为: 结构体变量名1.结构体变量名2.成员名 结构体变量初始化的格式如下: struct 结构体名 {结构体成员}结构体变量={初始数据}; 初始数据类型必须与结构成员的数据类型相匹配,并且先后顺序一一对应赋值。 要对结构体变量的成员地址进行访问,其语法格式为: &结构体变量.成员名 当一个指针变量用来指向一个结构变量时,称为结构体指针变量。结构体指针变量中的值是所指向的结构体变量的首地址。 结构体指针变量: Struct 结构名*结构体指针变量名 Struct student *pstu; 必须先赋值后使用,把结构体变量的首地址赋给指针变量,不能把结构名或结构体变量名赋给指针变量。 pstu=&stu1; 结构体名和结构体变量是两个不同的概念,结构体名只能表示一个结构形式,编译系统并不对它分配内存空间,只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。这是因为结构体变量被定义后相当于标准数据类型被使用。 利用结构体指针变量访问成员如下: (*结构体指针变量).成员名 或者: 结构体指针变量->成员名 后一种形式较为方便,容易区分。

结构体和类的比较

结构是一种用关键字struct声明的自定义数据类型。与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等,不过,结构是值类型。 1.结构的构造函数和类的构造函数不同。 2. a.结构不能包含显式的无参数构造函数。结构成员讲自动初始化为它们的默认值。 b.结构不能包含以下形式的初始值设定类:base(argument-list); 2.对于结构中的实例字段成员,不能在声明时赋值初始化。 3.声明了结构类型后,可以使用new运算符创建构造对象,也可以不使用new关键字。如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。 4.结构不支持继承,即一个结构不能从另一个结构或类继承,而且不能作为一个类的基类。但是,结构从基类OBJECT继承。结构也可以实现接口。 5.什么时候用结构呢?结构使用简单,并且很有用,但是要牢记:结构在堆栈中创建,是值类型,而类是引用类型。每当需要一种经常使用的类型,而且大多数情况下该类型只是一些数据时,使用结构能比使用类获得更佳性能。 结构是值类型,所以会影响性能,但根据使用结构的方式,这种影响可能是正面的,也可能是负面的。正面的影响是为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。在结构超出了作用域被删除时,速度也很快。另一方面,只要把结构作为参数来传递或者把一个结构赋给另一个结构(例如A=B,其中A和B是结构),结构的所有内容就被复制,而对于类,则只复制引用。这样,就会有性能损失,根据结构的大小,性能损失也不同。注意,结构主要用于小的数据结构。但当把结构作为参数传递给方法时,就应把它作为ref参数传递,以避免性能损失——此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速度一样快了。另一方面,如果这样做,就必须注意被调用的方法可以改变结构的值。 class和struct有且仅有一个区别,那就是对于class说明的类成员,函数也好,变量也好,如果没有指定类型,缺省是private限定的。而对于struct,则是public的。 结构体数组效率比类数组效率高(不需要装箱合拆箱)。结构体集合(如Hashtable)效率比类集合效率低。集合的元素是引用类型,所以结构体必须进行装箱和拆箱处理。所以类在大的集合中更有效率。

类和结构体的区别

类和结构体的区别 1. class和structure很相似,从技术层面讲,class是引用,而 structure则是数值.有人很形象的说 class里有行动,方法,成员,是有机体的结合,而structure则是活生生的有机体, 2. 通俗的理解,class包涵structure, class里有方法拉,成员 拉,什么滴, 而structure只有数据, 二 .类与结构的差别 %%%类成员默认是private,而结构体默认是 public。 1.值类型与引用类型 结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对 应 system.string 结构,通过使用结构可以创建更多的值类 型 类是引用类型:引用类型在堆上分配地址 堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑 因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用 注: 1.虽然结构与类的类型不一样,可是他们的基类型都是对象 (object),c#中所有类型的基类型都是object 2.虽然结构的初始化也使用了New 操作符可是结构对象依然分 配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用 2.继承性 结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed . 类:完全可扩展的,除非显示的声明sealed 否则类可以继承其

结构体的定义及初始化

?结构体类型定义 struct [结构体名] { 类型标识符成员名; 类型标识符成员名; ……………. };成员类型可以是基本型或构造型 struct是关键字,不能省略合法标识符 可省:无名结构体 结构体的说明及结构体变量的定义

例struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; name num sex age score addr 2字节 2字节 20字节 1字节 4字节 30字节 … ….. 结构体类型定义描述结构 的组织形式,不分配内存 例子图解

?结构体类型定义 struct [结构体名] { 类型标识符成员名; 类型标识符成员名; ……………. };成员类型可以是基本型或构造型 struct是关键字,不能省略合法标识符 可省:无名结构体 结构体的说明及结构体变量的定义

(1) 在结构体说明的同时定义结构体变量,例如:struct example { char *name; int age; }guo,zhang;(2)直接定义结构体变量,例如: struct {char *name; int age; }guo,zhang 未给 出结 构体 名 (3) 把定义和说明分开,例如:struct example { char *name; int age; }; struct example guo,zhang;结构体变量占用内存的大小可用sizeof()运算来求出 ?结构体变量的定义

结构体的说明及结构体变量的定义?变量说明形式 struct 结构体名结构体变量名; ?注意: 结构变量的存储类型概念、它的寿命、可见 性及使用范围与普通变量、数组等完全一致。 结构体变量说明必须在结构类型定义之后, 二者也可同时进行。

C语言结构体习题及答案

第9章结构体 1.定义以下结构体类型 struct s { int a; char b; float f; }; 则语句printf("%d",sizeof(struct s))的输出结果为【】。 A) 3 B) 7 C) 6 D) 4 2.当定义一个结构体变量时,系统为它分配的内存空间是【】 A)结构中一个成员所需的内存容量 B)结构中第一个成员所需的内存容量 C)结构体中占内存容量最大者所需的容量 D)结构中各成员所需内存容量之和 3.定义以下结构体类型 struct s { int x; float f; }a[3]; 语句printf("%d",sizeof(a))的输出结果为【】 A) 4 B) 12 C) 18 D) 6 7.定义以下结构体类型 struct student { char name[10]; int score[50]; float average; }stud1; 则stud1占用内存的字节数是【】。 A) 64 B) 114 C) 228 D) 7 9、设有一结构体类型变量定义如下: struct date { int year; int month; int day; }; struct worklist { char name[20]; char sex; struct date birthday; } person; 若对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。。。。

A. year=1976 B. birthday.year=1976 C. person.birthday.year=1976 D. person.year=1976 1、若程序中有以下的说明和定义: struct abc { int x;char y; } 花括号后少了分号。 struct abc s1,s2; 则会发生的情况是______。 A) 编译时错B) 程序将顺序编译、连接、执行C) 能顺序通过编译、连接、但不能执行D) 能顺序通过编译、但连接出错

结构体的指针应用

什么是结构体? 简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以作为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同。 定义结构体使用struct修饰符,例如: struct test { float a; int b; }; 上面的代码就定义了一个名为test的结构体,它的数据类型就是test,它包含两个成员a和b,成员a的数据类型为浮点型,成员b的数据类型为整型。由于结构体本身就是自定义的数据类型,定义结构体变量的方法和定义普通变量的方法一样。 test pn1; 这样就定义了一个test结构体数据类型的结构体变量pn1,结构体成员的访问通过点操作符进行,pn1.a=10 就对结构体变量pn1的成员a进行了赋值操作。注意:结构体生命的时候本身不占用任何内存空间,只有当你用你定义的结构体类型定义结构体变量的时候计算机才会分配内存。 结构体,同样是可以定义指针的,那么结构体指针就叫做结构指针。 结构指针通过->符号来访问成员,下面我们就以上所说的看一个完整的例子: #include #include using namespace std; struct test//定义一个名为test的结构体 { int a;//定义结构体成员a int b;//定义结构体成员b }; void main() { test pn1;//定义结构体变量pn1 test pn2;//定义结构体变量pn2 pn2.a=10;//通过成员操作符.给结构体变量pn2中的成员a赋值 pn2.b=3;//通过成员操作符.给结构体变量pn2中的成员b赋值

C语言中不同的结构体类型的指针间的强制转换详解

C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险。只要理解了其内部机制,你会发现C是非常灵活的。 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在结构体中的偏移地址。 变量的值是以二进制形式存储在内存中的,每个内存字节对应一个内存地址,而内存存储的值本身是没有整型,指针,字符等的区别的,区别的存在是因为我们对它们有不同的解读,param的值就是一个32位值,并且存储在某个内存单元中,通过这个32位值就能找到param所指向的结构的起始地址,通过这个起始地址和各个结构所包含变量离起始地址的偏移对这些变量进行引用, param->bIsDisable只是这种引用更易读的写法,只要param是指向 PAINT_PARAM的指针,那么param的值就肯定存在,param存在,偏移量已知,那么param->bIsDisable就肯定存在,只是要记住,param->bIsDisable只是代表了对param一定偏移地址的值。 不是说某个地址有那个结构体你才能引用,即使没有,你也能引用,因为你已经告诉了编译器param变量就是指向一个PAINT_PARAM结构体的变量并且指明了param的值,机器码的眼中是没有数据结构一说的,它只是机械的按照 指令的要求从内存地址取值,那刚才的例子来说,peg->x,peg->y的引用无论 0x30000000是否存在一个eg结构体都是合法的,如果0x30000000开始的8 个字节存在eg结构体,那么引用的就是这个结构体的值,如果这个位置是未定义的值,那么引用的结果就是这8个字节中的未定义值,内存位置总是存在的,而对内存中值的引用就是从这些内存位置对应的内存单元取值。 举个例子: typedefstruct_eg { int x; int y; }eg;

类与结构体的区别

类与结构体的区别 区别有三: 1: 类可以继承,结构不可以. 2: 类是引用类型,结构是值类型 3: 类在堆中,结构在栈分配内存 二 .类与结构的差别 1.值类型与引用类型 结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构,通过使用结构可以创建更多的值类型 类是引用类型:引用类型在堆上分配地址 堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复 杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑 因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间 的赋值只是复制引用 注: 1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类 型的基类型都是object 2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对 象不可用 2.继承性 结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed . 类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也 能被继承 注:虽然结构不能被继承可是结构能够继承接口,方法和类继承接口一样 例如:结构实现接口 interface IImage

{ void Paint(); } struct Picture : IImage { public void Paint() { // painting code goes here } private int x, y, z; // other struct members } 3.内部结构: 结构: 没有默认的构造函数,但是可以添加构造函数 没有析构函数 没有abstract和sealed(因为不能继承) 不能有protected修饰符 可以不使用new初始化 在结构中初始化实例字段是错误的 类: 有默认的构造函数 有析构函数 可以使用abstract和sealed 有protected修饰符 必须使用new初始化

第九章使用结构体类型处理组合数据 c语言

第九章使用结构体类型处理组合数据 1.定义和使用结构体变量 2.结构体数组 3.结构体指针 4.用结构体变量和结构体变量的指针作函数参数 5.用指针处理链表 6.共用体、枚举类型 正文 1.定义和使用结构体变量 若只保存某个学生的学号:可以使用int 变量。 若保存所有学生的学号:可以使用int 型的数组。 同理,若保存所有学生的姓名:可以使用char型的数组。 若保存所有学生某科成绩:可以使用float 型的数组。 但是,如果要同时保存某一个学生的学号,姓名,性别、入学时间及各科成绩,该用什么保存? 自己建立结构体类型 将一个学生的学号、姓名、性别、年龄和地址分别用以下变量来表示: int num; char name[20]; char sex; int age; char addr[30]; Num name sex age score addr 100101 Li Fun M 18 87.5 Beijing 声明一个结构体类型的一般形式为: struct 结构体名 {成员表列=类型名+成员名}; 如:struct student { int num;char name[20];char sex; int age;float score;char addr[30]; } 可以采取以下3种方法定义结构体类型变量:

(1)先声明结构体类型再定义变量名 例如:struct student student1, student2; | | | 结构体类型名结构体变量名 定义了student1和student2为struct student类型的变量,即它们具有struct student 类型的结构. student1 100102 WangLi F 20 98 Beijing student2 100101 ZhangXin M 19 90.5 Shanghai 在定义了结构体变量后,系统会为之分配内存单元。 例如:student1和student2在内存中各占63个字节(4+20+1+4+4+30=63)。(我们的VC) 注意: 将一个变量定义为标准类型(基本数据类型)与定义为结构体类型不同之处在于后者不仅要求指定变量为结构体类型,而且要求指定为某一特定的结构体类型,因为可以定义出许许多多种具体的结构体类型。 (2)在声明类型的同时定义变量 这种形式的定义的一般形式为: struct结构体名 { 成员表列 }变量名表列; struct student {int num; char name[20]; char sex; int age; float score; char addr[30]; }student1,student2;//它的作用与第一种方法相同,即定义了两个struct //student 类型的变量student1 student2 (3) 直接定义结构体类型变量 //注意: (2)对结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。 (3)成员也可以是一个结构体变量。 (4)成员名可以与程序中的变量名相同,二者不代表同一对象。 其一般形式为: struct { 成员表列 }变量名表列; 即不出现结构体名。 例如:struct date

(1)定义结构体的关键字是

(1) 定义结构体的关键字是,定义共用体的关键字是。 (2) 结构体和共用体的相同点是,不同点是。 (3) 若有以下定义和语句,则sizeof(a)的值是__ ___,而sizeof(b)的值是__ _。struct tu { int m; char n; int y;}a; struct { float p, char q; struct tu r} b; (4) 设有下面结构类型说明和变量定义,则变量a在内存所占字节数是。如果将该结构改成共用体,结果为。 struct stud { char num[6]; int s[4]; double ave; } a; (5) 下面程序用来输出结构体变量ex所占存储单元的字节数,请填空。 struct st { char name[20]; double score; }; main() { struct st ex ; printf("ex size: %d\n",sizeof( )); } (6) 下面定义的结构体类型拟包含两个成员,其中成员变量info用来存入整形数据;成员变量link是指向自身结构体的指针,请将定义补充完整。 struct node { int info; link; } (7) 以下程序执行后输出结果是。 main() { union { unsigned int n; unsigned char c; } u1; u1.c='A'; printf("%c\n",u1.n); } (8) 变量root如图所示的存储结构,其中sp是指向字符串的指针域,next是指向该结构的指针域,data用以存放整型数。请填空,完成此结构的类型说明和变量root的定义。 root struct { char *sp ; __ __; _ _; } root; 2. 阅读下面的程序,写出程序结果 (1) struct info { char a,b,c;}; main() { struct info s[2]={{‘a’,‘b’,‘c’},{‘d’,‘e’,‘f’}};int t; t=(s[0].b-s[1].a)+(s[1].c-s[0].b); printf("%d\n",t); } (2)

类与结构体的区别

区别有三: 1: 类可以继承,结构不可以. 2: 类是引用类型,结构是值类型 3: 类在堆中,结构在栈分配内存 二 .类与结构的差别 1.值类型与引用类型 结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构,通过使用结构可以创建更多的值类型 类是引用类型:引用类型在堆上分配地址 堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑 因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用 注: 1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object 2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用

2.继承性 结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的 sealed . 类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承 注:虽然结构不能被继承可是结构能够继承接口,方法和类继承接口一样 例如:结构实现接口 interface IImage { void Paint(); } struct Picture : IImage { public void Paint() { // painting code goes here } private int x, y, z; // other struct members }

c语言结构体定义结构体

c语言结构体定义结构体 代码1 定义结构体_m_usmart_devstruct _m_usmart_dev{struct _m_usmart_nametab *funs;//函数名指针 void (*init)(u8);//初始化u8 (*cmd_rec)(u8*str);//识别函数名及参数void (*exe) (void); //执行void (*scan)(void); //扫描u8 fnum; //函数数量u8 pnum; //参数数 量u8 id;//函数idu8 sptype;//参数显示类型(非字符串参数):0,10 进制;1,16 进制; u16 parmtype;//参数的类型u8 plentbl[MAX_PARM]; //每个参数的长度暂存表u8 parm[PARM_LEN]; //函数的参数}; 代码2 定义_m_usmart_dev 类型的结构体并对其赋初始值 struct _m_usmart_dev usmart_dev={usmart_nametab,usmart_init,usmart_cmd_rec,usmart_exe,usmart_scan, sizeof(usmart_nametab)/sizeof(struct _m_usmart_nametab),//函数数量0, //参数数 量0, //函数ID1,//参数显示类型,0,10 进制;1,16 进制0,//参数类型.bitx:,0,数字;1, 字符串0, //每个参数的长度暂存表,需要MAX_PARM 个0 初始化0,//函数的参 数,需要PARM_LEN 个0 初始化}; 上边代码可理解为 struct _m_usmart_dev{struct _m_usmart_nametab *funs;//函数名指针 void (*init)(u8);//初始化u8 (*cmd_rec)(u8*str);//识别函数名及参数void (*exe) (void); //执行void (*scan)(void); //扫描u8 fnum; //函数数量u8 pnum; //参数数 量u8 id;//函数idu8 sptype;//参数显示类型(非字符串参数):0,10 进制;1,16 进制; u16 parmtype;//参数的类型u8 plentbl[MAX_PARM]; //每个参数的长度暂存表u8 parm[PARM_LEN]; //函数的参数} usmart_dev={usmart_nametab,usmart_init,usmart_cmd_rec,usmart_exe,usmart_scan,

C语言结构体习题及答案知识讲解

C语言结构体习题及 答案

第9章结构体 1.定义以下结构体类型 struct s { int a; char b; float f; }; 则语句printf("%d",sizeof(struct s))的输出结果为【】。 A) 3 B) 7 C) 6 D) 4 2.当定义一个结构体变量时,系统为它分配的内存空间是【】 A)结构中一个成员所需的内存容量 B)结构中第一个成员所需的内存容量 C)结构体中占内存容量最大者所需的容量 D)结构中各成员所需内存容量之和 3.定义以下结构体类型 struct s { int x; float f; }a[3]; 语句printf("%d",sizeof(a))的输出结果为【】 A) 4 B) 12 C) 18 D) 6 4.定义以下结构体数组 struct c { int x; int y; }s[2]={1,3,2,7}; 语句printf("%d",s[0].x*s[1].x)的输出结果为【】 A) 14 B) 6 C) 2 D) 21

5.运行下列程序段,输出结果是【】 struct country { int num; char name[10]; }x[5]={1,"China",2,"USA",3,"France",4, "England",5, "Spanish"}; struct country *p; p=x+2; printf("%d,%c",p->num,(*p).name[2]); A) 3,a B) 4,g C) 2,U D) 5,S 6.下面程序的运行结果是【】。 struct KeyWord { char Key[20]; int ID; }kw[]={"void",1,"char",2,"int",3,"float",4,"double",5}; main() { printf("%c,%d\n",kw[3].Key[0], kw[3].ID); } A) i,3 B) n,3 C) f,4 D) l,4 7.定义以下结构体类型 struct student { char name[10]; int score[50]; float average; }stud1; 则stud1占用内存的字节数是【】。 A) 64 B) 114 C) 228 D) 7 8.如果有下面的定义和赋值,则使用【】不可以输出n中data的值。 struct SNode { unsigned id; int data; }n,*p; p=&n; A) p.data B) n.data C) p->data D) (*p).data 9.根据下面的定义,能输出Mary的语句是【】。

c#中结构体和类的比较

c#中结构体和类的比较 区别: 结构是一种用关键字struct声明的自定义数据类型。与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等,不过,结构是值类型。 1.结构的构造函数和类的构造函数不同。 a.结构不能包含显式的无参数构造函数。结构成员讲自动初始化为它们的默认值。 b.结构不能包含以下形式的初始值设定类:base(argument-list); 2.对于结构中的实例字段成员,不能在声明时赋值初始化。 3.声明了结构类型后,可以使用new运算符创建构造对象,也可以不使用new关键字。如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。 4.结构不支持继承,即一个结构不能从另一个结构或类继承,而且不能作为一个类的基类。但是,结构从基类OBJECT继承。结构也可以实现接口。 5.什么时候用结构呢?结构使用简单,并且很有用,但是要牢记:结构在堆栈中创建,是值类型,而类是引用类型。每当需要一种经常使用的类型,而且大多数情况下该类型只是一些数据时,使用结构能比使用类获得更佳性能。 最后引用博客园的“越过林子”的话: 结构是值类型,所以会影响性能,但根据使用结构的方式,这种影响可能是正面的,也可能是负面的。正面的影响是为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。在结构超出了作用域被删除时,速度也很快。另一方面,只要把结构作为参数来传递或者把一个结构赋给另一个结构(例如A=B,其中A和B是结构),结构的所有内容就被复制,而对于类,则只复制引用。这样,就会有性能损失,根据结构的大小,性能损失也不同。注意,结构主要用于小的数据结构。但当把结构作为参数传递给方法时,就应把它作为ref参数传递,以避免性能损失——此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速度一样快了。另一方面,如果这样做,就必须注意被调用的方法可以改变结构的值。 C#中结构与类的区别 作者:未知时间:2004-10-20 12:12 出处:互联网责编:jizhuwo 摘要:暂无 本文目录 类与结构的实例比较 类与结构的差别

C语言结构体习题及答案

1.定义以下结构体类型 struct s { int a; char b; float f; }; 则语句printf("%d",sizeof(struct s))的输出结果为【】。 A) 3 B) 7 C) 6 D) 4 2.当定义一个结构体变量时,系统为它分配的内存空间是【】 A)结构中一个成员所需的内存容量 B)结构中第一个成员所需的内存容量 C)结构体中占内存容量最大者所需的容量 D)结构中各成员所需内存容量之和 3.定义以下结构体类型 struct s { int x; float f; }a[3]; 语句printf("%d",sizeof(a))的输出结果为【】 A) 4 B) 12 C) 18 D) 6 7.定义以下结构体类型 struct student { char name[10]; int score[50]; float average;

}stud1; 则stud1占用内存的字节数是【】。 A) 64 B) 114 C) 228 D) 7 9、设有一结构体类型变量定义如下: struct date { int year; int month; int day; }; struct worklist { char name[20]; char sex; struct date birthday; } person; 若对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。。。。 A. year=1976 B. =1976 C. D. =1976 1、若程序中有以下的说明和定义: struct abc { int x;char y; } 花括号后少了分号。 struct abc s1,s2; 则会发生的情况是______。 A) 编译时错B) 程序将顺序编译、连接、执行C) 能顺序通过编译、连接、但不能执行D) 能顺序通过编译、但连接出错

第9章结构体类型与共用体类型习题及答案

第九章结构体类型与公用体类型习题及其答案9-3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。 解:#include "stdio.h" struct date { char month[10] ; int daynumber ; } main() { int i ; date a[12] ={{"January",31},{"February",29},{"March",31},{"Aprial",30}, {"May",31},{"June",30},{"july",31},{"August",31},{"September",30} ,{"October",31},{"November",30},{"December",31}} ; for(i=0;i<12;i++); printf("%d 月:%s %d\n",i+1,a[i].month,a[i].daynumber) ; } 思考:如何对结构体变量进行初始化?对结构体变量的引用为何要体现为分量(或成员)的引用? 9-4 编写程序求空间任一点到原点的距离,点用结构体描述。并请考虑求空间中任意两点的距离的程序。 解:#include "stdio.h" #include "math.h" struct point { float x ; float y ; float z ; } void main() { double d1,d2,d ;

point p1,p2 ; printf("请输入第一个点的坐标:"); scanf("%f,%f,%f",&p1.x,&p1.y,&p1.z); printf("请输入第二个点的坐标:"); scanf("%f,%f,%f",&p2.x,&p2.y,&p2.z); d1=sqrt(p1.x*p1.x+p1.y*p1.y+p1.z*p1.z); d2=sqrt(p2.x*p2.x+p2.y*p2.y+p2.z*p2.z); d=sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)+(p2.z-p1.z)*( p2.z-p1.z)); printf("第一个点到原点的距离:%f\n",d1); printf("第二个点到原点的距离:%f\n",d2); printf("两点间的距离:%f\n",d); } 9-5 编写输入、输出10个朋友数据的通讯录程序,每个朋友数据包括姓名、地址、邮编、电话、传呼、手机等数据。 解:#include "stdio.h" struct AddressBook { char name[10] ; char address[30] ; char mailnumber[7] ; char telphone[12] ; char byphone[16] ; char movephone[1] ; } void main() { int i ; AddressBook fd[10] ; for(i=0;i<10;i++) { printf("请输入第%d个朋友的信息:\n",i+1); printf("姓名:");

C语言习题 结构体和杂类(答案)

第十章结构体和杂类 一. 选择题 1. 如下说明语句,则下面叙述不正确的是(C)。 struct stu { int a ; float b ;} stutype; A.struct是结构体类型的关键字 B.struct stu是用户定义结构体 类型 C. stutype是用户定义的结构体类型名(变量名) D. a和b都是结 构体成员名 2. 在16位PC机中,若有定义:struct data { int i ; char ch; double f; } b ; 则结构变量b占用内存的字节数是(D)。 A.1 B.2 C.8 D.11 3. 设有定义语句:enum t1 {a1, a2 = 7, a3, a4 = 15} time;则枚举 常量a2和a3的值分别为(D)。 A. 1和2 B. 2和3 C. 7和2 D. 7和8 4. 以下程序的输出结果是( D )。 union myun { struct { int x, y, z; } u; int k; } a; main( ) { a.u.x=4; a.u.y=5; a.u.z=6; a.k=0; printf(" %d\n",a.u.x); } A. 4 B. 5 C. 6 D. 0 5. 当定义一个共用体变量时,系统分配给它的内存是( C )。 A.各成员所需内存量的总和 B.结构中第一个成员所需内存 量 C.成员中占内存量最大的容量 D.结构中最后一个成员所需内 存量 6. 若有以下程序段: union data { int i ; char c; float f;} a; int n; 则以下语句正确的是( C )。 A.a=5; B.a={2,’a’,1.2} C.printf(“%d”,a); D.n=a; 7. 设struct {int a; char b; } Q, *p=&Q;错误的表达式是( d )。 A.Q.a B.(*p).b C.p->a D.*p.b 9. 以下对C语言中共用体类型数据的叙述正确的是( c )。 A. 可以对共用体变量直接赋值 B.一个共用体变量中可以同时存放其所有成员 C.一个共用体变量中不能同时存放其所有成员 D.共用体类型定义中不能出现结构体类型的成员

C语言1-结构体类型概述、结构体类型变量

章节名称结构体类型概述、结构体类型变量 授课类型□理论□实验?理实一体□实训□实习 班级地点周次星期节次授课进度 ?符合□超前□滞后 ?符合□超前□滞后 ?符合□超前□滞后 教学目标知识目标 1.掌握结构体类型的声明方法 2.掌握结构体类型变量的定义、初始化和引用方法能力目标能根据实际需要声明结构体类型 教学重点1.结构体类型的声明方法 2.结构体类型变量的定义、初始化和引用方法 教学难点结构体类型的声明、结构体变量的引用教学方法讲授法、对比法、启发法、练习法 教学手段多媒体、机房电脑、板书 教学资源教材、教学PPT、微课视频、课程网站 教学设计 教学环节内容要点教学方法 与手段 时间 分配 导入 前面已经学习了基本类型(整型、实型、字符型)和一种构造类型——数 组,数组是将相同类型的多个数据组合在一起。在实际问题中,一组数据往 往具有不同的数据类型。例如,在学生成绩表中,一个学生的学号为整型、 姓名为字符型、成绩为实型,显然不能用一个数组将某个学生的这些数据组 合在一起。为解决这一问题,用户可以建立由不同类型数据组成的组合型数 据结构——结构体。 5 新课教学一、结构体类型的声明:关键字struct、结构体名、成员名讲授法10 二、结构体类型变量 1、定义结构体变量的方法 (1)先声明结构体类型,再定义结构体变量 (2)在声明结构体类型的同时定义结构体变量 (3)不指定结构体名而直接定义结构体变量 2、说明:(1)结构体成员也可以是一个结构体变量 (2)结构体成员名可与程序中其他变量同名 讲授法、 对比法 30 二、结构体变量的初始化和引用 1、结构体变量的初始化 2、结构体变量成员的引用:结构体变量名.成员名 【例6.1】 讲授法、 练习法 30 3、结构体变量的说明:(1)结构体变量成员的运算 (2)结构体变量地址和成员地址的引用 讲授法10 课堂小结结构体类型声明的方法,结构体变量的定义、初始化及引用方法 3 作业布置复习本次课内容;预习6.3节“结构体类型数组” 2 7S管理整理、整顿、清扫、清洁、素养、节约、安全课后 教学效果及改进思路

相关主题
文本预览
相关文档 最新文档