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

所属分类: 软件编程 / C 语言 阅读数: 132
收藏 0 赞 0 分享

定义:
结构体(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> &nbsp; &nbsp; &nbsp; 10001,
<SPAN style="WHITE-SPACE: pre"> </SPAN> &nbsp; &nbsp; &nbsp; "qianshou",
<SPAN style="WHITE-SPACE: pre"> </SPAN> &nbsp; &nbsp; &nbsp; 'm',
<SPAN style="WHITE-SPACE: pre"> </SPAN> &nbsp; &nbsp; &nbsp; 19,
<SPAN style="WHITE-SPACE: pre"> </SPAN> &nbsp; &nbsp; &nbsp; "100",
<SPAN style="WHITE-SPACE: pre"> </SPAN> &nbsp; &nbsp; &nbsp; "JiNan"
<SPAN style="WHITE-SPACE: pre"> </SPAN> &nbsp; };

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

(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++实现string与各种类型之间的转换

这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本
收藏 0 赞 0 分享

C++如何通过ostringstream实现任意类型转string

再使用整型转string的时候感觉有点棘手,因为itoa不是标准C里面的,而且即便是有itoa,其他类型转string不是很方便。后来去网上找了一下,发现有一个好方法
收藏 0 赞 0 分享

C/C++指针小结

要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区
收藏 0 赞 0 分享

C++ 类的静态成员深入解析

在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象
收藏 0 赞 0 分享

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

通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
收藏 0 赞 0 分享

C++类静态成员与类静态成员函数详解

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值
收藏 0 赞 0 分享

C++中的friend友元函数详细解析

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
收藏 0 赞 0 分享

static全局变量与普通的全局变量的区别详细解析

以下是对static全局变量与普通的全局变量的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
收藏 0 赞 0 分享

C++ explicit关键字的应用方法详细讲解

C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?下面就让我们一起来看看这方面的知识吧
收藏 0 赞 0 分享

教你5分钟轻松搞定内存字节对齐

随便google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则
收藏 0 赞 0 分享
查看更多