浅析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={
<SPAN style="WHITE-SPACE: pre"> </SPAN>       10001,
<SPAN style="WHITE-SPACE: pre"> </SPAN>       "qianshou",
<SPAN style="WHITE-SPACE: pre"> </SPAN>       'm',
<SPAN style="WHITE-SPACE: pre"> </SPAN>       19,
<SPAN style="WHITE-SPACE: pre"> </SPAN>       "100",
<SPAN style="WHITE-SPACE: pre"> </SPAN>       "JiNan"
<SPAN style="WHITE-SPACE: pre"> </SPAN>   };

结构体变量的引用
在定义了结构体变量之后,就可以引用这个变量。

(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;
}

(0)

相关推荐

  • 关于C++11的统一初始化语法示例详解

    前言 本文主要给大家介绍了C++11统一初始化语法的相关内容,关于在当前新标准C++11的语法看来,变量合法的初始化器有如下形式: X a1 {v}; X a2 = {v}; X a3 = v; X a4(v); 其实,上面第一种和第二种初始化方式在本质上没有任何差别,添加=则是一种习惯上的行为.使用花括号进行的列表初始化语法,其实早在C++98时代就有了,只不过历史上他们只是被用来对数组元素进行初始化操作,以及初始化自定义POD类型的数据(简单理解就是可以memcpy复制对象的类型).比如:

  • C++初始化列表学习

    何谓初始化列表与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段.在C++中,struct和class的唯一区别是默认的克访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示. 复制代码 代码如下: struct foo{    string name ;    int id ;    foo(string s, int i):name(s), id(i){} ; // 初始化列表}; 构

  • C++构造函数初始化顺序详解

    1.构造函数.析构函数与拷贝构造函数介绍 构造函数 1.构造函数不能有返回值 2.缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 3.创建一个对象时,系统自动调用构造函数 析构函数 1.析构函数没有参数,也没有返回值.不能重载,也就是说,一个类中只可能定义一个析构函数 2.如果一个类中没有定义析构函数,系统也会自动生成一个默认的析构函数,为空函数,什么都不做 3.调用条件:1.在函数体内定义的对象,当函数执行结束时,该对象所在类的析构函数会被

  • C++初始化函数列表详细解析

    在以下三种情况下需要使用初始化成员列表: 一,需要初始化的数据成员是对象的情况: 二,需要初始化const修饰的类成员: 三,需要初始化引用成员数据: 原因:C++可以定义引用类型的成员变量,引用类型的成员变量必须在构造函数的初始化列表中进行初始化.对于类成员是const修饰,或是引用类型的情况,是不允许赋值操作的,(显然嘛,const就是防止被错误赋值的,引用类型必须定义赋值在一起),因此只能用初始化列表对齐进行初始化.成员类型是没有默认构造函数的类.若没有提供显示初始化式,则编译器隐式使用成

  • C++类的静态成员初始化详细讲解

    记住:通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化!!! 复制代码 代码如下: #include <iostream>using namespace std;class test{public:static int num;};int test::num = 0;void main(){cout<<test::num <<endl;test::

  • 浅析C++中结构体的定义、初始化和引用

    定义:结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构. 声明一个结构体类型的形式是: 复制代码 代码如下: struct Student{      //声明一个结构体类型Student  int num;         //声明一个整形变量num  char name[20];   //声明一个字符型数组name  char sex;        //声明一个字符型变量sex  int age;         //声明一个整形变量age  float

  • 详解C语言中结构体的自引用和相互引用

    结构体的自引用(self reference),就是在结构体内部,包含指向自身类型结构体的指针. 结构体的相互引用(mutual reference),就是说在多个结构体中,都包含指向其他结构体的指针. 1. 自引用 结构体 1.1 不使用typedef时 错误的方式: struct tag_1{ struct tag_1 A; /* 结构体 */ int value; }; 这种声明是错误的,因为这种声明实际上是一个无限循环,成员b是一个结构体,b的内部还会有成员是结构体,依次下去,无线循环.

  • C++中结构体的类型定义和初始化以及变量引用

    C++结构体类型的定义和初始化 有时需要将不同类型的数据组合成一个有机的整体,以供用户方便地使用.这些组合在一个整体中的数据是互相联系的.例如,一个学生的学号.姓名.性别.年龄.成绩.家庭地址等项,都是这个学生的属性,见图 可以看到学号(num).姓名(name).性别(sex).年龄(age).成绩(score ).地址(addr)是与姓名为"Li Fun"的学生有关的.如果在程序中将num,name,sex,age,score,addr分别定义为互相独立的变量,就难以反映出它们之间

  • 深入分析C语言中结构体指针的定义与引用详解

    指向结构体类型变量的使用首先让我们定义结构体:struct stu{char name[20];long number;float score[4];} ;再定义指向结构体类型变量的指针变量:struct stu *p1, *p2 ;定义指针变量p 1.p 2,分别指向结构体类型变量.引用形式为:指针变量→成员:[例7-2] 对指向结构体类型变量的正确使用.输入一个结构体类型变量的成员,并输出. 复制代码 代码如下: #include <stdlib.h> /*使用m a l l o c (

  • 浅谈C语言中结构体的初始化

    <代码大全>建议在变量定义的时候进行初始化,但是很多人,特别是新人对结构体或者结构体数组定义是一般不会初始化,或者不知道怎么初始化.1.初始化 复制代码 代码如下: typedef struct _TEST_T {        int i;        char c[10];}TEST_T;TEST_T gst  = {1, "12345"};//可以初始化,设置i为1,s为一个字符串.TEST_T gst  = {1};//初始化个数少于实际个数时,只初始化前面的成员

  • 解析结构体的定义及使用详解

    结构的定义 定义一个结构的一般形式为: struct 结构名 { 成员表列 }成员表由若干个成员组成,每个成员都是该结构的一个组成部分.对每个成员也必须作类型说明. 例如: 复制代码 代码如下: struct stu { int num; char name[20]; int age; } 结构类型变量的说明结构体定义并不是定义一个变量,而是定义了一种数据类型,这种类型是你定义的,它可以和语言本身所自有的简单数据类型一样使用(如 int ).结构体本身并不会被作为数据而开辟内存,真正作为数据而在

  • C语言中结构体实例解析

    目录 一.结构体定义 二.实例演示 结构体作为函数参数 结构体指针 三.typedef struct 和 struct的区别 1.声明不同 2.访问成员变量不同 3.重新定义不同 总结 一.结构体定义 C语言结构体由一系列相同或者不同类型的数据构成的集合,结构体类型就是以struct关键字定义的数据类型. 结构体的格式如下: struct 结构名称 { 结构体所包含的数据成员,包括变量数组等 } 结构变量 ;//结构变量可以指定一个或多个 举例: struct Student { char na

  • go语言数组及结构体继承和初始化示例解析

    目录 分类 数组 数组定义 结构体 结构体继承 结构体初始化 成员的操作 同名字段 其它匿名字段 非结构体类型 结构体指针类型 结构体字段实现接口 分类 类型 名称 长度 默认值 说明 pointer 指针   nil   array 数组   0   slice 切片   nil 引⽤类型 map 字典   nil 引⽤类型 struct 结构体       数组 如果要存储班级里所有学生的数学成绩,应该怎样存储呢?可能有同学说,通过定义变量来存储.但是,问题是班级有80个学生,那么要定义80

  • 详解C语言中结构体的使用

    目录 结构体的声明 结构体成员的类型 结构体成员的访问 结构体的声明 结构体的定义:结构体是一些值的集合,这些值称为成员变量,结构体的每个成员可以是不同类型的变量. 举例: //定义结构体类型 struct tag//struct结构体关键字 tag结构体标签 struct tag结构体类型 { //成员变量 char name[20]; short age; char telphone[12]; char sex[5]; }s1,s2,s3;//s1,s2,s3是三个全局结构体变量 int m

  • 详解C语言中结构体(struct)的用法

    目录 粉丝问答 三种结构体类型变量说明 1. 先定义结构,再定义结构变量 2. 定义结构体类型的同时说明变量 3. 直接说明结构变量 结构体成员表示方法 结构体指针做参数 结构体初始化 定义变量的同时初始化 先定义在初始化 常用初始化 typedef与struct 前置声明 结构体对齐 粉丝问答 有个粉丝在群里问了这样一个问题,问题在图中已经标出,如下图. DQuestsion 头文件的结构体的定义为: typedef struct{ u8 bmRequestType; u8 bRequest;

随机推荐