浅析c++中的结构体struct

在表示某些结构化数据时,我们通常会使用数组来解决问题。可是由于信息比较松散、容易重名、数据存取不方便等原因,当所用数据过多时,那么使用数组解决问题便不是那么的方便了。此时,最好有一种新的数据类型,直接表示该问题的所有属性,结构体便应需而生。

什么是结构体?
由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构体(struct)。
结构由数目固定的成员构成;
各成员可以具有不同的数据类型;
一个结构变量在内存占有一片连续的存储空间;

知道了什么是结构体之后,下面我们应该知道的是
我们应该怎样定义结构体呢?
结构类型定义形式为:
struct 标识符 //标识符为你想定义的新的数据类型
{ 类型 成员1 ;
类型 成员2 ;

类型 成员n ;
} ;
例:

struct  employee  
  {  
    char  name [ 10 ] ;
    long  code ;
    double  salary ;
    char address [ 50 ] ;
    char  phone [ 20 ] ;
  } ;

新类型employee的使用和基本类型基本一致
1、定义一个变量 employee a;
2、定义数组 employee a[4];
3、指针 employee *a=&b;
4、作为函数参数 int f( employee a)
5、作为返回值类型
我们可以用不同方法定义一个结构变量
(1) 声明类型之后声明变量

  struct  employee  
{  char  name [ 10 ] ;
    long  code ;
    double  salary ;
    char address [ 50 ] ;
    char  phone [ 20 ] ;
} ;
……
employee  worker1, worker2, *Emp ;

(2) 声明类型的同时声明变量

 struct  employee  
{  char  name [ 10 ] ;
    long  code ;
    double  salary ;
    char address [ 50 ] ;
    char  phone [ 20 ] ;
}worker1, worker2, *Emp ;

(3) 直接声明结构类型变量(注意此时没有了结构类型标识符)

struct  
{  char  name [ 10 ] ;
    long  code ;
    double  salary ;
    char address [ 50 ] ;
    char  phone [ 20 ] ;
}worker1, worker2, *Emp ;

说明
(1) 结构变量占有一片连续内存空间,具有结构类型的特征`

struct  employee  
{  char  name [ 10 ] ;
    long  code ;
    double  salary ;
    char address [ 50 ] ;
    char  phone [ 20 ] ;
} ;
employee  worker1, worker2, 
	   *Emp = &worker1 ;

此时
在这里插入图片描述
(2) 一个结构类型的成员可以是另一个已定义的结构类型

struct  date
{  int  month ;
    int  day ;
    int  year ;
} ;
struct employee
{  char  name [ 10 ] ;
    date  birthday ;//为职工结构添加出生日期信息
    long  code ;
    double  salary ;
    char address [ 50 ] ;
    char  phone [ 11 ] ;
}  worker1, worker2 ;

但是,无穷的递归结构是无法实现的

struct  person
{  char  name [ 10 ] ;
    long  code ;
    double  salary ;
    char address [ 50 ] ;
    char  phone [ 11 ] ; 
    person son;//错误 此时为不能实现的无穷递归结构
}  worker1, worker2 ;

有一些小细节,是需要我们注意的!
1、定义结构变量时规范的写最好一行只定义一个变量
2、结构体内有char类型的成员时,要特别注意是否写为数组模式
eg:以下两个写法的含义是不一样的,我们通常会使用右边的写法,错误的使用了左边的写法,是一些初学者经常会犯的错误。
切记!

                          |
struct  employee          |       struct  employee
{  char  name [ 10 ] ;    |      {  char  name ;
    ……                    |         ……
} ;                       |       } ;
                          |

3、在定义结构体时,每个成员之间我们应该用 分号“ ;”隔开(而不是使用逗号,在给结构变量赋初值时才用逗号)

 struct  employee  
{  char  name [ 10 ] ;//此时为定义结构体,中括号内用分号隔开
    long  code ;
    double  salary ;
    char address [ 50 ] ;
    char  phone [ 20 ] ;
} ;
……
employee worker = {"Wang Li " , 991083456, 1200.5, "guang zhou " , "87111111 " } ;//此时为给结构变量赋初值,中括号内使用逗号隔开

4、规范来说,我们一般一行最好只定义一个结构变量。当然,一行定义多个变量也没有错误。

contact a;
contact b;

定义完结构体,我们的下一个任务便是了解如何对其进行初始化
1、声明结构类型变量可以同时初始化(需要按顺序依次初始化。若不按照顺序,是不符合语法的初始化,编译器可能直接报错)

正确写法
struct employee
{  char  name [ 10 ] ;
    long  code ;
    double  salary ;
    char address [ 50 ] ;
    char  phone [ 11 ] ;
}  worker = {"Wang Li " , 991083456, 1200.5, "guang zhou " , " 87111111 " } ;
错误写法 这里的"Wang Li " 并非long型,会导致编译器报错!
struct employee
{  char  name [ 10 ] ;
    long  code ;
    double  salary ;
    char address [ 50 ] ;
    char  phone [ 11 ] ;
}  worker = {991083456 ,"Wang Li " , 1200.5, "guang zhou " , " 87111111 " } ;

2、先定义变量再根据情况进行逐个初始化,指定将数据赋值给指定的属性

3也可以直接清零

employee a={0};//该结构体变量的每一位都是0

注意细节:
1、当单独给字符数组型的成员时应当使用strcpy来进行初始化而不是使用等号

strcpy(a.name,"John")//正确
a.name="John"//错误

使用strcpy是切记加头文件

#include <cstring>

2、注意使用大括号,末尾要使用分号结束
3、各字段的初始值要与该字段的类型匹配
4、各初始值以逗号分开
5、按顺序初始化

对成员访问
(1)访问结构变量的成员
在这里,我们会用到点运算符“.”

# include <iostream>
using namespace std ;
struct  weather		// 声明结构类型
{  double  temp;    double  wind;  } ;
int main ( )
{  weather  today ;	// 声明结构类型变量
    today . wind = 3.1 ;// 对结构变量成员赋值
    cout << “Wind =<< today . wind << endl ;// 按成员输出
}

格式为:变量名.成员变量名(today . wind)
在这里我们可以直接给它赋值 ,在这里赋值和普通变量赋值基本一致today . wind = 3.1 ;
这里的点运算符.可以理解为汉字里面的“的”,即today . wind 含义相当于“今天 的 风力”。
(2)用指针访问结构变量的成员
结构指针 -> 成员
(*结构指针 ) . 成员

# include <iostream>
using namespace std ;
# include <cstring>
struct  person
{ char name[20] ;   unsigned long id;   double salary; } ;
int main ( )
{  person   pr1 ;
   person *  pp ;		// 定义结构指针
   pp = & pr1 ;		// 取结构变量地址
   strcpy ( pp -> name ,  “David Marat” ) ;		// 对结构成员赋值
   pp -> id = 987654321 ;
   pp -> salary = 335.0 ;
   cout << pp -> name << ‘\t’ << pp -> id << ‘\t’ << pp -> salary << endl ;
}

(3)类型相同的结构变量可以整体赋值

# include <iostream>
using namespace std ;
struct  weather		
{  double  temp;    double  wind;  } yesterday ;
int main ( )
{  weather  today ;	
   yesterday . temp = 10.5 ;	
   yesterday . wind = 3.1 ;
   today = yesterday ;	// 结构变量整体赋值
   cout << “Temp =<< today . temp << endl ;
   cout << “Wind =<< today . wind << endl ;
}

注意:“类型相同的变量” 是指用同一类型标识符说明的变量

	struct  weather1		
	{  double  temp;    double  wind;  } yesterday ;
	struct  weather2		
	{  double  temp;    double  wind;  } today ;

yesterday 和 today尽管成员相同,但不是同类型变量不可以整体赋值。
小结
1、结构类型用struct定义,它由不同类型的数据成员组成。
2、 结构变量在内存占有一片连续的存储区间。
3、结构变量成员用圆点运算符和箭头运算符访问。
4、数组元素为结构类型时,称为结构数组,定义和访问遵循数组和结构的语法规则。
最后,我们以一道例题来结束这篇博客
描述
N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色。帽子的颜色用“red”,“blue”等字符串来表示。不同的小白鼠可以戴相同颜色的帽子。白鼠的重量用整数表示。

输入
输入第一行为一个整数N,表示小白鼠的数目。
下面有N行,每行是一只白鼠的信息。第一个为不大于1000的正整数,表示白鼠的重量,;第二个为字符串,表示白鼠的帽子颜色,字符串长度不超过10个字符。
注意:白鼠的重量各不相同。
输出
按照白鼠的重量从大到小的顺序输出白鼠的帽子颜色。
样例输入
3
30 red
50 blue
40 green
样例输出
blue
green
red
来源
医学部计算概论2006期末考试题

下面是博主自己编写的一个ac的答案,如果有有哪些不足之处可以改进的地方,请各位看官大老爷评论加以改进,万分感谢!

#include <iostream>

using namespace std;
struct animal
{
    int weight;
    char color[11];
};

int main()
{
    int n;
    cin>>n;
    animal mice[n];
    animal x;
    for(int i=0;i<n;i++)
    {
        cin>>mice[i].weight>>mice[i].color;
    }
    int max,k;
    for(int i=0;i<n-1;i++)
    {
        k=i;
        for(int j=i+1;j<n;j++)
            if(mice[j].weight>mice[k].weight)k=j;
        if(i!=k)
        {
            x=mice[i];mice[i]=mice[k];mice[k]=x;
        }
    }
    for(int i=0;i<n;i++)
    {
        cout<<mice[i].color<<endl;
    }

}

感谢各位的观看,希望对各位读者有所帮助。愿我们一起共同进步,如果喜欢博主的话记得点个关注哦,爱宁。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值