C++结构体的定义、初始化和引用
定义:
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
声明一个结构体类型的形式是:
- struct Student{ //声明一个结构体类型Student
- int num; //声明一个整形变量num
- char name[20]; //声明一个字符型数组name
- char sex; //声明一个字符型变量sex
- int age; //声明一个整形变量age
- float score; //声明一个单精度型变量
- char addr[30]; //声明一个字符型数组addr
- }
结构体类型变量的定义方法及初始化
定义结构体变量的方法:
(1)先声明结构体类型在定义变量名
- #include<iostream>
- using namespace std;
- int main(){
- struct Student{ //声明一个结构体类型Student
- int num; //声明一个整形变量num
- char name[20]; //声明一个字符型数组name
- char sex; //声明一个字符型变量sex
- int age; //声明一个整形变量age
- float score; //声明一个单精度型变量
- char addr[30]; //声明一个字符型数组addr
- };
- Student student1,student2;// 定义结构体类型变量student1和student2
- cout<<sizeof(Student)<<endl;
- cout<<sizeof(student1)<<endl;
- cout<<sizeof(student2)<<endl;
- return 0;
- }
在定义了结构体变量之后,系统会为之分配内存单元。(可以用sizeof函数查看分配的字节数,不同的编译系统存在差异)
(2)在声明类型的同时定义变量
- #include<iostream>
- using namespace std;
- int main(){
- struct Student{ //声明一个结构体类型Student
- int num; //声明一个整形变量num
- char name[20]; //声明一个字符型数组name
- char sex; //声明一个字符型变量sex
- int age; //声明一个整形变量age
- float score; //声明一个单精度型变量
- char addr[30]; //声明一个字符型数组addr
- }student1,student2;//声明变量student1和student2
- cout<<sizeof(Student)<<endl;
- cout<<sizeof(student1)<<endl;
- cout<<sizeof(student2)<<endl;
- return 0;
- }
(3)直接定义结构体类型变量
- #include<iostream>
- using namespace std;
- int main(){
- struct { //声明一个结构体类型Student
- int num; //声明一个整形变量num
- char name[20]; //声明一个字符型数组name
- char sex; //声明一个字符型变量sex
- int age; //声明一个整形变量age
- float score; //声明一个单精度型变量
- char addr[30]; //声明一个字符型数组addr
- }student1,student2;//声明变量student1和student2
- cout<<sizeof(student1)<<endl;
- cout<<sizeof(student2)<<endl;
- return 0;
- }
这种定义方法虽然合法,但是不常用。比较常用的是第一种方法。
关于结构体的类型要注意的几点:
(1)类型与变量是不同的概念,不要混淆。只能对结构体变量中的成员赋值,而不能对结构体类型赋值。
(2)对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于同类型的普通变量。
(3)结构体的成员也可以是一个结构体变量。
- #include<iostream>
- using namespace std;
- struct Date{ //声明一个结构体类型Date
- int month; //日期中的月份
- int day; //日期中的天
- int year; //日期中的年份
- };
- struct Student{ //声明一个结构体类型Student
- int num; //声明一个整形变量num
- char name[20]; //声明一个字符型数组name
- char sex; //声明一个字符型变量sex
- int age; //声明一个整形变量age
- Date birthday; //Date是结构体类型,birthday是Date的类型的变量
- float score; //声明一个单精度型变量
- char addr[30]; //声明一个字符型数组addr
- };
- int main(){
- Student qianshou;
- Date riqi;
- cout<<sizeof(riqi)<<endl;
- cout<<sizeof(qianshou)<<endl;
- return 0;
- }
(5)结构体中的成员名可以与程序中的变量名相同,但二者没有关系。
例如,程序中可以另定义一个整形变量,他与student中的num是两回事,互不影响。
2 结构体变量的初始化
(1)在定义结构体时对结构体变量指定初始值
- struct Student{ //声明一个结构体类型Student
- int num; //声明一个整形变量num
- char name[20]; //声明一个字符型数组name
- char sex; //声明一个字符型变量sex
- int age; //声明一个整形变量age
- float score; //声明一个单精度型变量
- char addr[30]; //声明一个字符型数组addr
- } student1={
- 10001,
- "qianshou",
- 'm',
- 19,
- "100",
- "JiNan"
- };
(2)在定义变量时进行初始化(这种方法更常用)
- struct Student{ //声明一个结构体类型Student
- int num; //声明一个整形变量num
- char name[20]; //声明一个字符型数组name
- char sex; //声明一个字符型变量sex
- int age; //声明一个整形变量age
- float score; //声明一个单精度型变量
- char addr[30]; //声明一个字符型数组addr
- };
- Student student1={
- 10001,
- "qianshou",
- 'm',
- 19,
- "100",
- "JiNan"
- };
结构体变量的引用
在定义了结构体变量之后,就可以引用这个变量。
(1)引用结构体变量中的一个成员的值
引用方式:结构体变量名.成员名
其中“.”是成员运算符,它在所有的运算符中优先级最高。
- #include<iostream>
- using namespace std;
- struct Date{ //声明一个结构体类型Date
- int month; //日期中的月份
- int day; //日期中的天
- int year; //日期中的年份
- };
- struct Student{ //声明一个结构体类型Student
- int num; //声明一个整形变量num
- char name[20]; //声明一个字符型数组name
- char sex; //声明一个字符型变量sex
- int age; //声明一个整形变量age
- Date birthday; //Date是结构体类型,birthday是Date的类型的变量
- float score; //声明一个单精度型变量
- char addr[30]; //声明一个字符型数组addr
- };
- int main(){
- Student one={001,"qianshou",'m',19,10,1,1993,100,"JiNan"};
- cout<<one.num<<endl;
- cout<<one.name<<endl;
- cout<<one.sex<<endl;
- cout<<one.age<<endl;
- cout<<one.birthday.month<<"/"<<one.birthday.day<<"/"<<one.birthday.year<<endl;
- cout<<one.score<<endl;
- cout<<one.addr<<endl;
- return 0;
- }
如果一个成员本社也是一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员。
例如:
cout<<one.birthday.month<<"/"<<one.birthday.day<<"/"<<one.birthday.year<<endl;
(2)可以将一个结构体变量的值付给另外一个具有形同机构的结构体变量。
- #include<iostream>
- using namespace std;
- struct Date{ //声明一个结构体类型Date
- int month; //日期中的月份
- int day; //日期中的天
- int year; //日期中的年份
- };
- struct Student{ //声明一个结构体类型Student
- int num; //声明一个整形变量num
- char name[20]; //声明一个字符型数组name
- char sex; //声明一个字符型变量sex
- int age; //声明一个整形变量age
- Date birthday; //Date是结构体类型,birthday是Date的类型的变量
- float score; //声明一个单精度型变量
- char addr[30]; //声明一个字符型数组addr
- };
- int main(){
- Student two={1,"qianshou",'m',19,10,01,1993,100,"JiNan"};
- Student one=two;
- cout<<one.num<<endl;
- cout<<one.name<<endl;
- cout<<one.sex<<endl;
- cout<<one.age<<endl;
- cout<<one.birthday.month<<"/"<<one.birthday.day<<"/"<<one.birthday.year<<endl;
- cout<<one.score<<endl;
- cout<<one.addr<<endl;
- return 0;
- }
(3)可以引用结构体变量的地址,也可以引用结构体变量成员的地址。
- #include<iostream>
- using namespace std;
- struct Date{ //声明一个结构体类型Date
- int month; //日期中的月份
- int day; //日期中的天
- int year; //日期中的年份
- };
- struct Student{ //声明一个结构体类型Student
- int num; //声明一个整形变量num
- char name[20]; //声明一个字符型数组name
- char sex; //声明一个字符型变量sex
- int age; //声明一个整形变量age
- Date birthday; //Date是结构体类型,birthday是Date的类型的变量
- float score; //声明一个单精度型变量
- char addr[30]; //声明一个字符型数组addr
- };
- int main(){
- Student two={1,"qianshou",'m',19,10,01,1993,100,"JiNan"};
- Student &one=two;
- one.num++;
- one.birthday.day+=10;
- cout<<two.num<<endl;
- cout<<two.name<<endl;
- cout<<two.sex<<endl;
- cout<<two.age<<endl;
- cout<<two.birthday.month<<"/"<<two.birthday.day<<"/"<<two.birthday.year<<endl;
- cout<<two.score<<endl;
- cout<<two.addr<<endl;
- return 0;
- }
一个小实例:
- #include<iostream>
- using namespace std;
- struct Date{ //声明一个结构体类型Date
- int month; //日期中的月份
- int day; //日期中的天
- int year; //日期中的年份
- };
- struct Student{ //声明一个结构体类型Student
- int num; //声明一个整形变量num
- char name[20]; //声明一个字符型数组name
- char sex[5]; //声明一个字符型变量sex
- int age; //声明一个整形变量age
- Date birthday; //Date是结构体类型,birthday是Date的类型的变量
- float score; //声明一个单精度型变量
- char addr[30]; //声明一个字符型数组addr
- };
- int main(){
- Student one;
- //输入信息
- cout<<"请输入学号:";
- cin>>one.num;
- cout<<"请输入姓名:";
- cin>>one.name;
- cout<<"请输入性别:";
- cin>>one.sex;
- cout<<"请输入年龄:";
- cin>>one.age;
- cout<<"请输入生日的年 月 日:";
- cin>>one.birthday.year;
- cin>>one.birthday.month;
- cin>>one.birthday.day;
- cout<<"请输入你的成绩:";
- cin>>one.score;
- cout<<"请输入地址:";
- cin>>one.addr;
- //输出信息
- cout<<"\n以下是你的信息\n";
- cout<<"学号:"<<one.num<<endl;
- cout<<"姓名:"<<one.name<<endl;
- cout<<"性别:"<<one.sex<<endl;
- cout<<"年龄:"<<one.age<<endl;
- cout<<"生日:"<<one.birthday.year<<"/"<<one.birthday.month<<"/"<<one.birthday.day<<endl;
- cout<<"成绩:"<<one.score<<endl;
- cout<<"地址:"<<one.addr<<endl;
- return 0;
- }
C++结构体的定义、初始化和引用相关推荐
- c语言中申请内存并初始化,c语言中结构体的定义、初始化及内存分配
#include struct person { char *name; int age; }; int main() { //结构体可以定义在函数内,也可以定义到函数外 //相当于全局变量与局部变量 ...
- 定义结构体时的初始化默认值
结构体变量定义时的初始化问题: 默认值同变量一样,int型的为0,指针型的为"NULL"------------并不是整个结构体为NULL,其中的int型还是有值0的,只是指针型的 ...
- 相互引用的结构体的定义
首先声明,简单的头文件重复包含问题不在此文的讨论范围之内,此问题可以通过下面的文件格式进行解决. #ifndef __filename_h__ #define __filename_h__ /* co ...
- Golang——结构体创建与初始化、结构体与数组、结构体与切片、结构体与map、结构体作为函数参数、结构体方法、结构体方法继承
结构体: 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 结构体可以很好的管理一批有联系的数据,使用结构体可以提高程序的易读性,类似于Java的类一样 不能在结构体直接赋值 字段名必须唯一 ...
- C语言中的结构体,结构体中数组初始化与赋值
最近写c语言中的结构体遇到了些问题,从网上找了些资料如下: 结构体是连续存储的,但由于结构体中成员类型各异,所以会存在内存对齐问题,也就是内存里面会有空档,具体的对齐方式这里 暂不讨论: 1.结构体的 ...
- 上期所API头文件一、ThostFtdcUserApiStruct.h---API结构体的定义及工作流程(源代码6.3.19版)
结构体的定义及工作流程 一.API工作流程 1.1.MdApi 1.2.TraderApi 二. ThostFtdcUserApiStruct结构体的定义 三.源代码 一.API工作流程 1.1.Md ...
- C语言结构体的定义与使用、结构体数组、指向结构体的指针(有代码详解)
1.结构体的定义与使用 结构体是一种构造数据类型 把不同类型的数据组合成一个整体 结构体的定义形式: struct 结构体名{结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数 ...
- 结构体中定义函数指针
结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;- }; struct 结构体标识符 *指针变量名; 变量初始化 ...
- go结构体初始化_go语言基础之结构体普通变量初始化
1.结构体 1.1.结构体类型 有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性.显然单独定义以上变量比较繁琐,数据不便于管理. 结构体是一种聚合的数 ...
最新文章
- Analysis and Design Overview
- 嵌入式学习笔记--网络打流补充笔记(iperf3应用)
- 【Caffe实践】基于Caffe的人脸检测实现
- java提高篇(三十)-----Iterator
- 01-HTML基础与进阶-day5-录像262
- Why settype table is used in Genil component implementation
- 指数函数中x的取值范围_基本初等函数I: 指数函数、对数函数和幂函数
- 换工作,让我里外不是人,到底错在哪儿
- 【uva 1395】Slim Span(图论--最小生成树+结构体快速赋值 模版题)
- 面试准备每日系列:计算机底层之并发编程(三)JVM-垃圾回收
- 从事 Android 开发六年,我学到的那些事!
- 设定asp服务器外部组件对象的方法是,ASP 3.0对ASP 2.0的改进
- 单片机c语言实习报告,单片机C语言程序设计实训100例.pdf
- 怎么把qq音乐flac改成mp3格式
- 一个最全产品开发流程
- python seek使用_Python seek()用法及代码示例
- AMD CPU 开启Android Studio emulator虚拟机
- 一个人赶着鸭子去每个村庄卖,每经过一个 村子卖去所赶鸭子的一半又一只。 这样他经过了 七个村子后还剩 两只鸭子,问问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
- 软件测试技能大赛山东省,2018年全国职业院校技能大赛山东省选拔赛高职组软件测试赛项规程.pdf...
- 原生app登录 后台方案(token方案)