自定义数据类型 C++ 结构体类型 共同体类型 枚举类型 类类型{}
一。结构体类型
结构体类型,共用体类型,枚举类型,类类型等统称为自定义类型(user-defined-type,UDT)。
结构体相当于其他高级语言中的记录(record);例如:
struct Student{
int num;
char name[20];
char sex;
int agel
float score;
char addr[30];
};
结构体声明的一般形式:
struct 结构体类型名 {成员列表};
结构体类型名用作结构体类型的标志,上面的Student就是结构体类型名。上例中num,name等都称为结构体中的成员。在声明一个结构体类型时必须对各成员都进行类型声明,即: 类型名 成员名; 每个成员称为结构体中的一个域,成员列表又称为域表。
注意:C语言中,结构体的成员只能是数据(就如上面的例子一样);C++中则对此进行了扩充,结构体的成员可以包括数据,可以包括函数(成员函数),以适应面向对象的程序设计。
二。结构体类型定义的方法和初始化
1.定义结构体类型变量的方法有一下三种:
(1)先声明结构体类型,再定义变量名。
如上面已经定义了一个结构体类型Student,可以使用它来定义结构体变量。如
Student student1,student2;
结构体变量定义之后,系统会为之分配内存单元。
C语言中,定义结构体变量时,要在结构体类型名前面加上关键字struct,C++保留了C的用法。如:struct Student student1,student2;
(2)在声明变量时,同时定义。
struct Student
{
int num;
char name[20];
int sex;
float score;
char addr[30];
}student1,student2;
这种定义的形式为:
struct 结构体名
{
成员列表
}变量列表;
(3)直接定义结构体变量类型,期一般形式:
struct
{
成员列表
}变量名列表;
记住:在编译时,是不会为类型分配空间的,只是为变量分配空间。在结构体中的成员名可以与程序中的变量名相同,但是两者没有必然联系。例如, 在程序中可以定义一个整型变量num,它与student中的num是两回事,互不影响。
2.结构体变量的初始化。
struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}student1={10001,"wangjiun","M",19,90.5,"sahgnhai"};
也可以将声明和定义类型分开,在定义变量时进行初始化。如
Student student1={10002,"chengong",'f',20,98,"Beijing"};//Student是已经声明的结构体类型;
3.结构体变量的引用。
引用结构体变量中成员的一般方式: 结构体变量名.成员名称; 如,student1.num=10001;
"."是成员运算符。它在所有的运算符中优先级最高。因此可以将student1.num当做一个整体看。
4.结构体数组
结构体数组与数值数组不同之处:每个数组元素都是一个结构体类型的数据,她们都包括各个成员项。
定义结构体数组:和定义结构体变量的方法相仿,定义结构体数组时只需声明其为数组即可。
struct Student
{
int num;
char name[20];
int age;
float score;
char addr[30];
};
Student stu[3];//定义Student类型的数组stu
也可以直接定义一个结构体数组。如:
struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu[3];
或者:
struct
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu[3];
结构体初始化:结构体初始化与其他数组一样,对结构体数组可以初始化。
struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu[3]={{1001,"linlin",'M',18,98.4,"Beijing"},{1002,"lijun",'F',18,98.4,"Beijing"},{1001,"wangxiajian",'M',18,90,"Shanghai"}};
定义数组stu时,也可以不指定元素个数,即可以写成:
stu[]={{...},{...},{...}};编译时,系统会根剧初始值的结构体常量的个数来确定数组元素的个数。
三。指向结构体变量的指针
一个结构体变量的指针就是该变量所占的内存段的起始地址。
可以设置一个指针变量来指向结构体变量,此时该指针变量的值就是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。
1.通过指向结构体变量的指针引用结构体变量中的成员。
#include <iostream>
#include <string>
using namespace std;
struct gjjou
{
int num;
string name;
char sex;
float score;
};
int main()
{
gjjou stu;
gjjou *p=&stu;
stu.num=103001;
stu.name="wangjingjing";
stu.sex='F';
stu.score=9.9;
cout<<(*p).num<<" "<<(*p).name<<" "<<(*p).sex<<" "<<(*p).score<<" "<<endl;
cout<<stu.name<<" "<<stu.num<<" "<<stu.sex<<" "<<stu.score<<" "<<endl;
return 0;
}
为了使用直观,C++提供了指向结构体变量的运算符”->“,例如,p->num表示指针p当前指向的结构体变量中的成员num。p->和(*p).num等价。以下 三种形式等价:
1.结构体.成员名。 如,stu.num;
2.(*p).成员名。 如,(*p).num;
3.p->成员名。 如p->num。”->“称为指向运算符。
注意:
p->n 得到p指向的结构体变量中的成员n的值。
p->n++ 得到p指向的结构体变量中的成员n的值,用完该值后使它加1.
++p->n 得到p指向的结构体变量中成员n的值,并使之加1,然后再使用它。
2.用结构体变量和指向结构体变量的指针构成链表。
3.结构体类型数据作为函数参数。
(1)用指向结构体变量的指针作为实参,将结构体变量的地址传递给形参。
(2)将结构体变量的引用变量作为函数参数。
四。动态分配和撤销内存的运算符new和delete
1.对动态链表中的节点的插入与删除,C语言中利用库函数malloc和free来分配和撤销内存空间。C++提供了运算符new和delete来取代malloc和delete。
注意:new和delete是运算符。不是函数。
new int;//开辟一个存储空间,返回一个指向该空间的地址。
new int(100);//开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址
new char[10]; //开辟一个存放字符数组的空间(包括10个元素),返回首地址。
new int[5][4]; //开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址。
float *p=new float(3.141592); //开辟一个存放单精度的空间,并指定该实数的初值为3.141593,将返回的该空间地址赋给指针变量p;
new运算符使用的一般格式:
new 类型[初值];
注意:用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,new会返回一个空指针NULL;用户可以根据该指针的值判断分配空间是否成功。
delete [] 指针变量
前面撤销new开辟的存放单精度的空间,应该用 delete p;
前面用"new char[10];"开辟的字符数组空间,如果把new返回的指针赋给了指针变量pt,则应该以下面的形式撤销空间:delete [] pt;
自定义数据类型 C++ 结构体类型 共同体类型 枚举类型 类类型{}的更多相关文章
- 编程C语言进阶篇——自定义数据类型:结构体
一.结构体 定义方法: 结构名 变量名 特点: 两个同类型的结构变量可以相互赋值,但是结构变量之间不能使用"<","=="等运算符,如果使用则需要对运算符 ...
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...
- C语言-06复杂数据类型-04 结构体
结构体的说明(构造类型) 数组:只能由多个相同类型的数据构成 结构体:可以由多个不同类型的数据构成 ,结构体的类型是不存在的,自己定义 int main() { // 1.定义结构体类型 定义类型的时 ...
- 建立自己的数据类型——C结构体归纳
一.建立结构体类型 1.申明结构体类型 struct 结构体名 { 成员表列(类型名 成员名:); }: 例如: struct Person { char name; int age; char se ...
- android109 结构体,联合体,枚举,自定义
#include <stdio.h> #include <stdlib.h> void study(){ printf("吃饭睡觉打李志\n"); } // ...
- C语言基本语法——结构体、联合和枚举
一.结构体 1.什么是结构体 2.结构体语法格式 3.结构体所占内存空间 4.结构体成员赋值 二.联合 1.什么是联合 2.联合语法格式 三.枚举 1.什么是枚举 2.枚举语法格式 一.结构体 1.什 ...
- C语言进阶——结构体,联合,枚举
----------------------------------------------------------我是一条划分线----------------------------------- ...
- C++-结构体,联合体,枚举,的区别
结构体: struct NUM { int number; }a; 结构体是声明只是一个模型,没有分配内存空间.当进行定义结构体变量后才分配内存空间 联合体: union data { int a ...
- 如何让c语言使用结构体近似模拟c++中的类
如今统治市场的主流编程语言,如c++,java,大都是面向对象类型的编程语言. 而众所周知,c语言是面向过程的编程语言,但是它拥有一个类似于类的结构,叫做结构体,主要的区别在于结构体无法定义函数. 因 ...
随机推荐
- NSURLCredential 代表认证结果证书?
NSURLCredential 代表认证结果证书?
- Mysql 之实现多字段模糊查询
在一个table中有省,市,县,期,栋,单元,室几个字段,然后用户输入一个地址从表中的字段拼接起来进行模糊查询. 解决办法: <MySQL权威指南>中CONCAT的使用方法,在书中的对CO ...
- Git及Github环境搭建(Windows系统)
一.github账号注册 1.打开网址https://github.com 注册账号: 二.本地安装Git 1.安装包下载地址:链接:https://pan.baidu.com/s/1smpnJL7 ...
- HTML5 video常用属性
一.视频video常用标签方法 <!-- controls 控制条,播放暂停等 controlslist 控制不允许全屏 不允许下载等 poster 封面 autoplay 自动播放 muted ...
- day37-3 异常处理
目录 异常处理 捕捉异常 raise assert 异常处理 捕捉异常 语法错误无法通过try检测,就像函数一样 try: 1/0 except Exception as e: # Exception ...
- JAVA版CORBA程序
1.题目分析题目1.Java版CORBA程序1——HelloWorld编写实现显示“Hello,World!+班级+中文姓名”字符串.题目2.JAVA版CORBA程序2——Counter编写实现连加. ...
- php多进程防止出现僵尸进程
对于用PHP进行多进程并发编程,不可避免要遇到僵尸进程的问题. 僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程(zombie)进程.任何进程在退出前(使用exit退出) ...
- eas之执行sql的方式
客户端: 1. 有返回集合:查询 //查询出DB中所有该字段的值,与其进行比较,若有相同的则报错 String sql="select CFWuliaoCode fr ...
- 原来这才是Kafka的“真面目”
作者介绍 郑杰文,腾讯云存储,高级后台工程师,2014 年毕业加入腾讯,先后从事增值业务开发.腾讯云存储开发.对业务性.技术平台型后台架构设计都有深入的探索实践.对架构的海量并发.高可用.可扩展性都有 ...
- 在 Linux 下判断系统当前是否开启了超线程
转自: http://www.cnblogs.com/wjoyxt/p/4804293.html #lscpu Thread(s) per core: 2 Core(s) per socket: 6 ...