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.