struct 使用浅谈。

一、定义:
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。

声明一个结构体类型的形式是:

structstudent  //声明一个结构体类型student

{

intnum;   //声明一个整形变量num

charname[20];  //声明一个字符型数组name

charsex;   //声明一个字符型变量sex

intage;    //声明一个整形变量age

floatscore; //声明一个单精度浮点型变量score

}
二、结构体类型变量的定义方法及初始化

1、定义结构体变量的方法:
1)先声明结构体类型再定义变量名

#include <iostream>

using namespace std;

int main()

{

struct Student  //声明一个结构体类型student

{

intnum;   //声明一个整形变量num

charname[20];  //声明一个字符型数组name

charsex;   //声明一个字符型变量sex

intage;    //声明一个整形变量age

floatscore; //声明一个单精度浮点型变量score

};  //要记得这儿的这个分号一定要有,否则会显示student1 和student2 undeclared identifier

Student student1,student2; //定义结构体变量类型student1和student2

cout<<sizeof(Student)<<endl;

cout<<sizeof(student1)<<endl;

cout<<sizeof(student2)<<endl;

return 0;

}
运行结果:36

36

36

Press any key to continue

注:在定义了结构体变量之后,系统会为之分配内存单元。(可以用sizeof函数查看分配的字节数,不同的编译系统存在差异,本文中的所有运行结果都是在VC6.0下的)

2)在声明类型的同时定义变量

#include<iostream>

usingnamespace std;

int main()

{

structStudent  //声明一个结构体类型student

{

int num;   //声明一个整形变量num

char name[20];  //声明一个字符型数组name

char sex;   //声明一个字符型变量sex

int age;    //声明一个整形变量age

float score; //声明一个单精度浮点型变量score

}student1,student2; //定义结构体变量类型student1和student2

cout<<sizeof(Student)<<endl;

cout<<sizeof(student1)<<endl;

cout<<sizeof(student2)<<endl;

return 0;

}

运行结果:如(1)

3)直接定义结构体类型变量

#include <iostream>

using namespace std;

int main()

{

struct

{

int num;   //声明一个整形变量num

charname[20];  //声明一个字符型数组name

charsex;   //声明一个字符型变量sex

int age;    //声明一个整形变量age

float score;//声明一个单精度浮点型变量score

}student1,student2;//定义结构体变量类型student1和student2

cout<<sizeof(student1)<<endl;

cout<<sizeof(student2)<<endl;

return 0;

}

运行结果36

36

Press any key to continue

注:这种定义方法虽然合法,但是不常用。比较常用的是第一种方法。

关于结构体的类型要注意的几点:
(1)类型与变量是不同的概念,不要混淆。只能对结构体变量中的成员赋值,而不能对结构体类型赋值。

(2)对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于同类型的普通变量。

(3)结构体的成员也可以是一个结构体变量。

#include <iostream>

using namespace std;

structDate  //声明一个结构体变量Date

{

intyear;  //日期中的年份

intmonth;  //日期中的月份

intday;   //日期中的天

};//注意此处的分号必须是在英文字符的输入状态下的!!

struct Student

{

intnum;   //声明一个整形变量num

charname[20];  //声明一个字符型数组name

charsex;   //声明一个字符型变量sex

intage;    //声明一个整形变量age

floatscore; //声明一个单精度浮点型变量score

};  //注意此处的分号一定要在英文字符的输入状态下输入的!!

int main()

{

Studentchengd;

Dateriqi;

cout<<sizeof(chengd)<<endl;

cout<<sizeof(riqi)<<endl;

return 0;

}

运行结果:36

12

Press any key to continue

5)结构体中的成员名可以与程序中的变量名相同,但二者没有关系。

例如,程序中可以另定义一个整形变量,他与student中的num是两回事,互不影响。

2 结构体变量的初始化
1)在定义结构体时对结构体变量指定初始值

#include <iostream>

using namespace std;

struct Student

{

intnum;   //声明一个整形变量num

charname[20];  //声明一个字符型数组name

charsex;   //声明一个字符型变量sex

intage;    //声明一个整形变量age

floatscore; //声明一个单精度浮点型变量score

}student={10000,"chengd","man",19,"100"};
2)在定义变量时进行初始化(这种方法更常用)

#include <iostream>

using namespace std;

struct Student

{

intnum;   //声明一个整形变量num

charname[20];  //声明一个字符型数组name

charsex;   //声明一个字符型变量sex

intage;    //声明一个整形变量age

floatscore; //声明一个单精度浮点型变量score

};

Studentstudent={10000,"chengd","man",19,"100"};

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

(1)引用结构体变量中的一个成员的值

引用方式:结构体变量名.成员名

其中“.”是成员运算符,它在所有的运算符中优先级最高。

#include <iostream>

using namespace std;

struct Date

{

intyear;

intmonth;

intday;

};

struct Student

{

intnum;   //声明一个整形变量num

charname[20];  //声明一个字符型数组name

charsex;   //声明一个字符型变量sex

Datebirthday; //Date 是结构体类型,birthday是Date的类型的变量

floatscore; //声明一个单精度浮点型变量score

};

intmain()

{

StudentA={001,"chengd",‘m‘,1994,11,11,100};

cout<<A.num<<endl;

cout<<A.name<<endl;

cout<<A.sex<<endl;

cout<<A.birthday.year<<‘/‘<<A.birthday.month<<‘/‘<<A.birthday.day<<endl;

cout<<A.score<<endl;

return0;

}运行结果:1

chengd

m

1994/11/11

100

如果一个成员本身也是一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员。

例如:cout<<A.birthday.month<<"/"<<A.birthday.day<<"/"<<A.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(){
   Studenttwo={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;
}

运行结果:

2

Qianshou

M

19’10/11/1993

100

Jinan

一个小实例:

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

时间: 2024-12-07 12:57:28

struct 使用浅谈。的相关文章

浅谈C++容器动态内存管理的优化

在信息学竞赛中,C++的容器的用途非常广泛,但经常因常数过大而超时.怎样才能提高它们的效率呢? 我们知道,容器是存储同一类对象的对象,既然"对象"我们无法改变,那么我们只能从"存储"入手,不难想到,不同容器在实现上的根本区别是它们对应着不同的内存组织方式,内存管理无疑是这种实现的核心,所以优化内存管理是加快容器效率的最好途径之一. 一.内存分配器简介 怎样才能优化内存管理呢?很简单,C++为我们提供了这样的接口,我们可以通过自定义容器模板中的最后一个allocato

浅谈RAII&智能指针

关于RAII,官方给出的解释是这样的"资源获取就是初始化".听起来貌似不是很懂的哈,其实说的通俗点的话就是它是一种管理资源,避免内存泄漏的一种方法.它可以保证在各种情况下,当你对对象进行使用时先通过构造函数来进行资源的分配和初始化,最后通过析构函数来进行清理,有效的保证了资源的正确分配和释放.(特别是在异常中,因为异常往往会改变代码正确的执行顺序,这就很容易引起资源管理的混乱和内存的泄漏) 其中智能指针就是RAII的一种实现模式,所谓的智能就是它可以自动化的来管理它所指向那份空间的资源

浅谈C中的malloc和free

在C语言的学习中,对内存管理这部分的知识掌握尤其重要!之前对C中的malloc()和free()两个函数的了解甚少,只知道大概该怎么用——就是malloc然后free就一切OK了.当然现在对这两个函数的体会也不见得多,不过对于本文章第三部分的内容倒是有了转折性的认识,所以 写下这篇文章作为一个对知识的总结.这篇文章之所以命名中有个“浅谈”的字眼,也就是这个意思了!希望对大家有一点帮助! 如果不扯得太远的话(比如说操作系统中虚拟内存和物理内存如何运做如何管理之类的知识等),我感觉这篇文章应该是比较

浅谈差分约束系统——图论不等式的变形

浅谈差分约束系统——图论不等式的变形 ----yangyaojia 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! 一.定义 如若一个系统由n个变量和m个不等式组成,并且这m个不等式对应的系数矩阵中每一行有且仅有一个1和-1,其它的都为0,这样的系统称为差分约束( difference constraints )系统. 二.分析 简单来说就是给你n个变量,给m个形如x[i]-x[j]≥k①或x[i]-x[j]≤k②.求两

浅谈linux内核栈(基于3.16-rc4)

在3.16-rc4内核源码中,内核给每个进程分配的内核栈大小为8KB.这个内核栈被称为异常栈,在进程的内核空间运行时或者执行异常处理程序时,使用的都是异常栈,看下异常栈的代码(include/linux/sched.h): 1 union thread_union { 2 struct thread_info thread_info; 3 unsigned long stack[THREAD_SIZE/sizeof(long)]; 4 }; THREAD_SIZE值为8KB,因此内核为进程的异常

浅谈Linux中的信号机制(二)

首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Linux内核源码评头论足.以后的路还很长,我还是一步一个脚印的慢慢走着吧,Linux内核这座山,我才刚刚抵达山脚下. 好了,言归正传,我接着昨天写下去.如有错误还请各位看官指正,先此谢过. 上篇末尾,我们看到了这样的现象:send进程总共发送了500次SIGINT信号给rcv进程,但是实际过程中rcv只接受/处理了1

C++:浅谈c++资源管理以及对[STL]智能指针auto_ptr源码分析,左值与右值

C++:浅谈c++资源管理以及对[STL]智能指针auto_ptr源码分析 by 小威威 1. 知识引入 在C++编程中,动态分配的内存在使用完毕之后一般都要delete(释放),否则就会造成内存泄漏,导致不必要的后果.虽然大多数初学者都会有这样的意识,但是有些却不以为意.我曾问我的同学关于动态内存的分配与释放,他的回答是:"只要保证new和delete成对出现就行了.如果在构造函数中new(动态分配内存),那么在析构函数中delete(释放)就可以避免内存泄漏了!" 事实果真如此么?

hdu1875浅谈prim算法的朴素实现

阅读原题 题目大意 给你几个(<=100)小岛的坐标,然后你把所有的岛都修上桥连接起来,求最小花费,还有个附加的限制:只有岛之间的距离大于等于10,或小于等于1000时才能修桥. 大概是因为十米以内不用建桥,千米以上无法建桥.哈哈,说着玩的. 很明显这是一道MST(最小生成树)的题目,貌似也有人用并查集AC过. 最小生成树算法 概述 最小生成树的常用算法有两个kruskal和prim算法.两者都是不停地执行归并操作,然而一言以蔽之,两者的不同之处在于:kruskal----归并边:prim---

【架构】浅谈web网站架构演变过程

浅谈web网站架构演变过程 前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变. 该系统具备的功能: 用户模块:用户注册和管理 商品模块:商品展示和管理 交易模块:创建交易和管理 阶段一.单机构建网站 网站的初期,我们经常会在单机上跑我们所有的程序和软件.此时我们使用一个容器,如tomcat.jetty.jboos,然后直接使用JSP/servlet技术,或者使用一些开源的框架如maven+spring+struct+hibernate.maven+spri