结构体【struct】
结构体【struct】
一.结构体定义
概念:结构体是由一系列不同或相同基本类型数据组合而成的新的复合数据集合,从而使这些数据项组合起来反应一个信息。
意义:结构体的使用为处理复杂的数据结构(如动态数据结构等)提供了有效的手段,而且,它们为函数间传递不同类型的数据提供了方便。
特点:
1.结构体类型是用户自行构造的;
2.它由若干不同的基本数据类型的数据构成。
3.它属于C语言的一种数据类型,与整型、实型相当。因此,定义它时不分配空间,只有用它定义变量时才分配空间。
4.结构体类型中的成员名可以与程序中的变量名相同,两者并不代表同一对象,编译程序可 以自动对他们进行区分。
结构体类型的定义:
一般形式
Struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
……
};
①.先定义结构,再说明结构变量。这种是C语言中定义结构体类型变量最常见的方式。
Struct 结构体名
{
成员列表;
};
Struct 结构体名 变量名;
如:
struct Clerk //职工信息
{ long num; char name[20]; int age;
};
struct Clerk p1,p2; //变量p1和p2同为 Clerk结构类型。
也可以用宏定义使一个符号常量来表示一个结构类型, 例如:
#define CLERK struct Clerk
CLERK
{
Long num;
char name[20];
int age;
};
CLERK p1,p2;
②.在定义结构类型的同时说明结构变量。这种形式的定义为:
Struct 结构体名
{
成员列表;
} 变量名;
实例如:
struct Clerk
{
Long num;
char name[20];
int age;
} p1,p2;
③.直接说明结构变量。这种形式的定义为:
Struct // 没有结构体名
{
成员列表;
} 变量名;
例如:
struct
{
Long num;
char name[20];
int age;
} p1,p2;
二.结构体的大小:
一个结构体变量占用内存的实际大小,可以利用sizeof来求出。它的运算表达式为:
Sizeof(运算量) //求出给定的运算量占用内存空间的字节数
其中运算量可以是变量、数组或结构体变量,可以是数据类型的名称。
例如:
Sizeof(struct clerk)
Sizeof(p1)
三.结构体类型嵌套
结构体类型中可包含以定义的结构体类型。
struct date{
int month;
int day;
int year;
} ;
struct Clerk
{
Long num;
char name[20];
struct date birthday;
} ;
变量定义:如:struct Clerk p1,p2;
成员引用:p1.num, p1.name,
P1.bd.year , p1.bd.month, p1.bd.day
初始化:struct clerk p={0017482, “Li shan”,{1986,6,15}};
△注意:结构体类型和变量也有全局和局部之分
定义在所有函数之外的结构体类型(变量)称为全局(或外部)结构体类型(变量)。
定义在函数内部的结构体类型(变量)称为局部(或内部)结构体类型(变量)。
结构体类型一般定义为全局的,定义位置一般在主函数之前。
结构体变量初始化时,初始值类型对应成员的数据类型一致,否则会出错。
四.结构体变量的初始化
与其他类型变量一样,也可以给结构的每个成员赋初值,这称为结构体的初始化。一种是在定义结构体变量时进行初始化。语法格式如下:
Struct 结构体名 变量名={初始数据表};
另一种是在定义结构体类型时同时进行结构体变量的初始化。
Struct 结构体名
{
成员列表;
}变量名={初始数据表}; 如:
struct Clerk
{
Long num;
char name[20];
struct date birthday;
} p1={0017482, “Li shan”,{1986,6,15}};
还有一种是在main函数中进行初始化。
Struct 结构体名 变量名;
变量名.成员名 = 数值;
变量名.成员名 = 数值;
……
Struct clerk p2;
P2.num = 0017482;
P2.name =” lishan”;
P2.birthday = {1986,6,15}};
五.结构体数组
§1.结构体数组的定义
**具有相同结构体类型的结构体变量也可以组成数组,即为结构体数组。结构体数组的每一个数组元素都是结构体类型的数据,他们都分别包含各个成员项。
其定义形式如下:
Struct 结构体名
{
成员列表;
};
Struct 结构体名 数组名[元素个数];
Struct student
{Char name[20];Char sex;Int age;Char addr[20];
};
Struct student stu[3];
§2.结构体数组的初始化
Struct 结构体名
{
成员列表;
};
Struct 结构体名 数组名[元素个数]={初始数据表};
OR
Struct 结构体名
{
成员列表;
} 数组名[元素个数]={初始数据表};
§3.结构体数组的使用
一个结构体数组的元素相当于一个结构体变量,因此有关结构体变量的规则也适用于结构体数组的元素。
⑴.引用某一元素中的成员。
如要引用数组第一个元素的name成员,则可写为:
stu[1].name
⑵.可以将一个结构体数组元素赋值给同一结构体类型的数组的另一个元素,或赋给同一类型的变量,如:
Struct student stu[3] , student1;
现在定义了一个结构体类型的数组,它有3个元素,又定义了一个结构体类型变量student1,
则下面的赋值是合法的。
Student1 = stu[0];
Stu[0] = stu[1];
Stu[1] = student1;
⑶.不能把结果体数组元素作为一个整体直接进行输入输出。如:
Printf(“.......”,stu[0]);
scanf(“.......”,&stu[0]);
都是错误的。
只能是以单个成员为对象进行输入输出,如:
scanf(“.......”,&stu[0].name);
scanf(“.......”,&stu[0].num);
Printf(“.......”,stu[0].name);
Printf(“.......”,stu[0].num);
六.结构体指针
△1.指向结构体变量的指针
结构体变量所占内存的首地址称为结构变量的指针。
结构体指针变量的定义:
Struct结构体名称*结构体指针变量名;
例如
Struct clerk{Long num;Char name[20];Struct data bd;}a,*pa;
例如:
struct clerk b,*pb;
注意:结构体指针变量必须先赋值后使用。
△2.结构体指针变量赋初始值
将结构体变量的首地址赋给指针变量,如:
Struct clerk a,*pa=&a;
Struct clerk b,*pb;
pb=&b;
△3.通过结构体指针变量引用结构体成员
一般形式:(*指针变量).成员名
如:(*pa).num=10; 等价于 a.num=10;
Get((*pa).name); 等价于 get(a.name);
(*pa).bd.year=1986; 等价于 a.bd.year=1982;
△4.指向运算符:“->”直观地引用结构体成员。
例如:上例可改写为:
pa->num=10; get(pa->name);pa->bd.year=1986;
△5.指向结构体数组的指针
#结构体数组的首地址,称为结构体数组的指针。例如
Struct clerk
{Int num;Char name[20];Struct date birthday;
}a[3],*p;
或:struct clerk a[3],*p;
P=a;
则:p->a[0];p+1->a[1];p+2->a[2];
#通过指针访问数组元素的成员:
P->num=10; 等价于 a[0].num=10;
scanf(“%s”,p->name); 等价于 scanf(“%s”,a[0].name);
如果:p++;则 p->a[1];
p->num=10; 等价于 a[1].num=10;
/* 应用举例:利用指向结构体的数组的指针输出结构体数组*/
struct clerk
{
int num;
char name[20];
int age;
char addr[40];
};
int main()
{struct clerk *p, a[3]={{101,"zhangsan",26,"shanghai"},{102,"lishan",27,"hubei"},{103,"wangwu",28,"changsha"}};
int i;
for(i=0,p=a; i<3;i++,p++)printf("%d,%s,%d,%s\n",p->num,p->name,p->age,p->addr);
}
七.如何取出结构体变量中的每一个成员?
总结三种方法:①.结构体变量.成员名
②.(*指针变量).成员名
③.结构体变量—>成员名
八.结构体变量和结构体指针变量作为函数参数传递的问题。
#结构体变量做函数参数
struct clerk
{int num;char name[20];int age;char addr[40];
};
void func(struct clerk a);
int main(void)
{
struct clerk a={101,"zhangsan",26,"shanghai"};
func(a);
}
void func(struct clerk b)
{
printf("%d,%s,%d,%s\n",b.num,b.name,b.age,b.addr);
}
#结构体指针作函数参数:赋地址传递
struct clerk
{
int num;
char name[20];
int age;
char addr[40];
};
void output(struct clerk*p);
int main(void)
{
struct clerk*p,a[3]={{101,"zhangsan",26,"shanghai"},{102,"lishan",27,"hubei"},{103,"wangwu",28,"changsha"}};
p=a;
output(p);
}
void output(struct clerk *p)
{
int i;
for(i=0;i<3;i++,p++)
printf("%d,%s,%d,%s\n",p->num,p->name,p->age,p->addr);
return 0;
}
结构体变量作为函数参数数据传递方式是赋值传递(单向值传递),实参把它每一个的成员的值依次传递形参,运行时间与存储空间的开销很大,程序运行效率很低。实际应用中,一般使用结构体指针作为函数参数。
结构体【struct】相关推荐
- linux 结构体 struct addrinfo 简介
目录 定义 相关方法 1. getaddrinfo(const char, const char, const struct addrinfo, struct addrinfo*) 2. freead ...
- 结构体struct timeval 和 struct timespec的定义
结构体struct timeval 和 struct timespec的定义均在头文件<sys/time.h>中,具体定义如下: struct timeval {long tv_sec; ...
- Golang结构体struct的使用(结构体嵌套, 匿名结构体等)
转自: https://studygolang.com/articles/11313 golang中是没有class的,但是有一个结构体struct,有点类似,他没有像java,c++中继承的概念,但 ...
- linux sock结构体,struct socket结构体详解
在内核中为什么要有struct socket结构体呢? struct socket结构体的作用是什么? 下面这个图,我觉得可以回答以上两个问题. 由这个图可知,内核中的进程可以通过使用struct ...
- 内核中用于数据接收的结构体struct msghdr
我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,ping另一台主机172.16.48.1.我们使用系统调用send ...
- C/C++结构体struct 与结构体数组和枚举型enum的结合使用
C/C++结构体struct 与结构体数组和枚举型enum的结合使用 #include "stdafx.h" #include <string> #include &l ...
- 内核中用于数据接收的结构体struct msghdr以及iovec介绍
我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,ping另一台主机172.16.48.1.我们使用系统调用send ...
- 获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf
http://blog.csdn.net/windeal3203/article/details/39320605 Linux 下 可以使用ioctl()函数 以及 结构体 struct ifreq ...
- C语言 结构体 struct Cat cat1;
引入 使用传统技术解决 需要定义多个变量或数组 结构体与结构体变量的关系示意图 类似Java类中的对象(结构体)与属性(结构体变量) 一切物体都可以看作对象(结构体) 补充:C语言数据类型 简单使用案 ...
- go struct 静态函数_Go语言学习笔记(四)结构体struct 接口Interface 反射reflect...
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
最新文章
- 数组树/fenwicktree/Binary Indexed Tree
- 定制android触控平板,Adobe发表六款Android平板用触控Apps,一套六款的工具组合
- 字符定长文件Linux怎么生成,Linux中的more命令-逐页显示长文本文件
- 基于泛型编程的序列化实现方法
- 【iOS开发-74】解决方式:Xcode6下利用preference保存数据,终于的plist文件在哪里?...
- 回炉重造-数据结构之数组列表
- ubuntu14.04安装arm-linux-gcc,Ubuntu14.04下arm-linux-gcc交叉编译环境搭建
- 计算机论文的致谢部分写什么,毕业论文致谢部分怎么写-论文致谢部分如何写在线等请问毕业论文最后一部分致谢要怎么写呀. 爱问知识人...
- Java线程中断的理解(转载)
- 浅谈CSS选择器中的空格
- FPGA基础知识21(PL控制PS端DDR的设计)
- 【《Real-Time Rendering 3rd》 提炼总结】(八) 第九章 · 全局光照:光线追踪、路径追踪与GI技术进化编年史
- 太牛了!B 站 UP 主开发会写高考作文的 AI
- 【总结】最专业最系统的CV内容,有三AI所有免费与付费的计算机视觉课程汇总(2022年7月)...
- OCSNG inventory | 介绍
- KL-MPLC无人值守系统
- 如何成为一名合格的DBA
- Quill富文本的使用以及自定义图片和视频处理事件
- 已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。 注:参赛球队列表见附录 注2:使用Math.random 来产生随机数。(也可以使用其它方法) 2. 2
- 5个小技巧 教你在家里如何给花儿拍“写真”