第五章 结构

本文详细介绍了C++中的结构体,包括如何定义和初始化结构体变量、定义结构体数组、访问成员,以及结构体在内存中的表现和使用注意事项。特别强调了结构体成员可以是其他结构类型,但不能是自身类型,而指针可以。还讨论了结构体数组的使用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struct:结构体structure

c++中的几个基本类型如 int/char/short,float/double,数组,指针,但是还是不够用,将基本类型组合起来,新形成的数学据类型,称为“自定义类型”
例:

struct student  //struct是关键字  后面是新类型的名字
{              //接下来会有很多成员,花括号里面是一系列成员变量
  int id;      //成员定义的方式和普通定义的方式一样
  char name[16];
  char phone[16];注意  定义成员用“;”赋初始值用“,”
}结构体变量表;  //可以同时定义多个结构体变量,需要用“,”隔开,**最后“;”不要漏掉**

struct:结构体

定义一个变量(利用上面所定义的)接着
(1)定义一个变量
student c;
(2)定义数组
student c[111];
(3)指针
student *p=&c;
(4)作为函数参数
void test (student c);
(5)作为返回值类型
student make (int id)

(1) 变量定义和初始化

定义一个变量

student a;//定义一个变量,不给初始值

定义时初始化:用大括号,将各个成员***按顺序***的初始值列出。(对比二维数组初始化)

struct student  
{              
  int id;      
  char name[16];
  char phone[16];
}; 
student a=
{
201501,  //int初始化
"adaf" ,  //字符数组初始化
"12363255426"    //最后一个不用    “,”
};

和一维数组一样,可以只初始化部分成员变量。
student a={20005,’‘john’’};//只初始化前两个成员
也可以直接清零
student a={0};//则每位变量的每一位都是0。
注意: 1.初始化时候一定要用花括号,结尾用“;”结束
2.各字段的初始值要与该字段的类型匹配
3.各初始值要以逗号隔开
4.空间上各位都是连续的

(2)定义数组

可以和基本类型一样,定义数组,表示并排的多个对象。
student a[3];

student a[3]=
{
  {2001,"acs","1232102123"},
  {2002,"ass","1232102124"},
  {2003,"aos","1232102125"}
}

若输出cout<<a[1].id则是第二行的2002

(3)对成员的访问

使用点号访问其成员:
名字 + . + 结构里的名字

student a;
a.id=201501;
strcpy(a.name,"John");//strcpy函数用于字符串的拷贝。
strcpy(a.phone,"12011245231");//而不可以用student.phone student只是一个类型名字而已,只有变量才对应内存

定义结构

struct student      
{                
  int id;      
  char name[16];
  char phone[16];
}worker1,worker2,*Emp;

相比
下面灵活性好

struct student  
{              
  int id;      
  char name[16];
  char phone[16];
}; 
student work1,work2,*Emp;
Emp=&worker1;

一个结构类型的成员可以是另一个已定义的结构类型
例:

struct *date*
{
  int dan;
  int year;
};
struct employee
{
 char name[10];
 *date* birthday;
};


不可以

sturct date
{
 ...;
 date z;//错误!!!不能实现无穷递归结构  不允许!!!分量不可以是本身
        //可以把z定义成指针加个*指向本身
 ...;
};

结构体中的成员类型不能是该结构体本身,却可以是以该结构体类型为基本类型的指针类型
结构体所占用内存必须在编译时确定,如果一个结构体中含有它本身,那么这个结构体所占用的内存大小是多少呢?这会循环形成一个永远也无法计算清楚的数值;如果是结构体指针,那么久好说了,指针只占用4个字节,因此可以成为结构体成员。

访问结构

结构变量 . 成员
例:

#include <iostream>
using namespace std;
struct weather//声明结构类型
{
 double temp;
 double wind;
 char name[10];
};
int main()
{
weather today;//声明结构类型变量
today.temp=1.1;//对结构类型变量成员赋值  访问结构变量
today.wind=1.2;
cout<<"temp="<<today.temp<<endl;  //输出
cout<<"wind="<<today.wind<<endl;
}

//输入用cin 若是字符串有空格用cin.get()输入
2.用指针访问结构变量成员
结构指针->成员 和 (*结构指针).成员 //(“.”运算符比 *高 所以套括号) 二者一样可以访问

int main()
{weather p;
weather *q;//定义结构指针
q=&p;//取结构变量地址
strcpy(q->name,"gfsdjfgj");
q->temp=1.1;
q->wind=1.2;
cout<<q->name<<'/t'<<q->temp<<q->wind
}

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

#include <iostream>
using namespace std;
struct weather//声明结构类型
{
 double temp;
 double wind;
 char name[10];
}***yesterday***;
int main()
{
weather today;
yesterday.temp=1.1;
yesterday.wind=1.2;
***today=yesterday;***//结构变量整体赋值
cout<<"temp="<<today.temp<<endl;  //输出
cout<<"wind="<<today.wind<<endl;
}

类型相同变量是指的用同一类型标识符说明的变量
struct weather//声明结构类型
{
double temp;
double wind;
}yesterday;
struct weather//声明结构类型
{
double temp;
double wind;
}today;
yesterday和today尽管成员相同,但不是同类型的变量不可以整体赋值
但可以yesterday.wind可以赋值给today.wind

结构数组

数组的元素类型为结构类型时,成为结构数组
例:

struct type
{
int a;
double x;
};
type ary[3];

ary[3]是一个有3个元素的数组,类型是type
数组每个元素包括两个数据成员
ary[0].a ary[0].x
ary[1].a ary[1].x
ary[2].a ary[2].x

#include<iostream>
using namespace std;
struct hhh
{
char name[10];
int num;//若输入的话这样
//for(int i=0;i<3;i++)
//{
//cin>>leader[i].nmae;
//leader[i].count=0;
//}

}stu[3] = { { "li",0 },{ "wang",0 },{ "lin",0 } };//3个候选人还有票数0
int main()
{
char leadername[10][10];//输入多个字符串看下面解释
int i, j;
for (j = 0; j < 10; j++)
cin >> leadername[j];
for (i = 0; i<3; i++)
for (j = 0; j<10; j++)
{
if (strcmp(leadername[j], stu[i].name) == 0)
stu[i].num++;
}
for (i = 0; i < 3; i++)
cout << stu[i].name << stu[i].num << endl;
return 0;
}

一维

#include<iostream>
using namespace std;

int main()
{
char leadername[10];
int  j;
for (j = 0; j < 10; j++)
cin >> leadername[j];

for (j = 0; j < 10; j++)
cout << leadername[j]<< endl;
return 0;
}

结果
aaa ccc ddd eee ffff gggg hhh fgg ooo lll lll iii
a
a
a
c
c
c
d
d
d
e

Process returned 0 (0x0) execution time : 22.198 s
Press any key to continue.
二维

#include<iostream>
using namespace std;

int main()
{
char leadername[10][10];
int  j;
for (j = 0; j < 10; j++)
cin >> leadername[j];

for (j = 0; j < 10; j++)
cout << leadername[j]<< endl;
return 0;
}

结果
aaa ccc ddd www aaaa fff gggh jjjjg gggb nnn mmm
aaa
ccc
ddd
www
aaaa
fff
gggh
jjjjg
gggb
nnn

Process returned 0 (0x0) execution time : 17.728 s
Press any key to continue.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jdicat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值