书P108:
结构体变量占用内存的大小可以用 sizeof(结构体类型名或变量名)计算
设计实际程序进行实践验证:
#include <iostream>
using namespace std;
int main()
{
struct Date//声明一个结构体类型 Date
{
int month;
int day;
int year;
};
struct Student//声明一个结构体类型 Student
{
int num;
char name[20];
char sex;
int age;
Date birthday;
char addr[30];
};
cout <<"sizeof(Date)=" << sizeof(Date) << endl;
cout <<"sizeof(Student)="<< sizeof(Student) << endl;
}
注意:
结构体类型名必须和定义时的大小写完全一致
结果:
书P109:
如果初始值的数目少于成员数目,剩余成员将被自动初始化为0。
#include <iostream>
using namespace std;
int main()
{
struct Student//声明一个结构体类型 Student
{
int num;
char name[20];
char sex;
int age;
char addr[30];
};
Student a = { };
cout << "a.num=" << a.num << endl;
cout << "a.name=" << a.name << endl;
cout << "a.sex=" << a.sex << endl;
cout << " a.age=" << a.age << endl;
cout << "a.addr=" << a.addr << endl;
}
结果:
注意:
结构体的变量名必须为标识符(按标识符的标准来命名执行)
如果把中间结构体的初值改为:
Student a = { 2,"aa",'jjjj' };
结果就(为)是:
如果中间忘记输入了某一项且类型不一样,程序自然会自动报错:
(如果前后两项类型一致那自然是将输入的数据记为前面一项的数据)
所以,从程序最终的实践结果来看,我们根本无需担心程序会不会进行自动类型转换之类的东西
那么另外新的一个问题又来了:
如果我在创建一个表的时候,咱暂时没有中间某个成员的某项数据
需要暂时把他空出来,并且需要把后面其他的一些数据项输入进去的时候,怎么办?
书P109:
(2)可以引用一个结构体变量中的一个成员的值。引用结构体变量中成员的一般方式为:
<结构体变量名>.<成员名>
例如,可以如下对变量的成员赋值:
studl.num=10010;
怎么理解?
书P110:
由于“.”运算符的优先级最高,student1.age++相当于(student1.age)++ 。
++是对student1.age进行自加运算,而不是先对age进行自加运算。
这里的student1.age++与age自加
有什么不一样?
student1.age++ :指结构体student1的成员age自加1
age++是指单独的变量age自加1
在结构体中,对各成员变量进行操作要写成student1.age或者student->age的形式。
——————参考(来)自百度
书P110:
不能将一个结构体变量作为一个整体进行输入和输出。
#include<iostream>
using namespace std;
struct date
{
int year; int month; int day;
};
int main()
{
date d1;
cin >> d1;
cout << d1;
}
结果:
例7-1引用结构体变量中的成员。
源程序:
#include <iostream>
using namespace std;
struct Date
{
int month;
int day;
int year;
};
struct Student
{
int num;
char name[20];
char sex;
Date birthday;//声明birthday为Date类型的成员
float score;
}student1, student2 = { 10002,"Wang Li",'f',5,23,1982,89.5 };
//定义 Student 类型的变量 student1、student2,并对student2 初始化
int main()
{
student1 = student2;//将student2 各成员的值赋予 student1的相应成
cout << student1.num << endl; //输出student1中的num 成员的值
cout << student1.name << endl;//输出student1 中的name 成员的值
cout << student1.sex << endl; //输出 studentl 中的sex成员的值
cout << student1.birthday.month << '/'
<< student1.birthday.day << '/'
<< student1.birthday.year << endl;
//输出studentl中的birthday各成员的值
cout << student1.score << endl;
return 0;
}
结果:
为什么这里
char name[20];
对应的输入项
可以用双引号输入且可以输入多个字符,而
char sex;
对应的输入项
只能用单引号且只能输入一个字符
且如果输入多个字符,则只输出多个字符中的最后一个字符
例:
输入
student2 = { 10002,"Wang Li",'fhbj',5,23,1982,89.5 };
则输出结果为:
10002
Wang Li
j
5/23/1982
89.5
另外,书上并没有对结构体中的指针使用情况做任何具体详细介绍
于是我们在这里进行补充:(详见:66 结构体-结构体指针_哔哩哔哩_bilibili)
在结构体的程序里,如果我们像正常函数一样使用指针,结果会发现最后并不能正常运行,例:
#include <iostream>
using namespace std;
int main()
{
struct Student//声明一个结构体类型 Student
{
int num;
string name;
int age;
};
Student s;
int* p = &s;
}
结果显示:
原因其实很简单,因为:
当我们对变量s进行“取地址”操作的话,返回的值从自然发展来说应该很顺理成章的就是我们所定义的“Student”类型,也就是说,这里指针指向的应该是一个“Student”的类型:
Student* p = &s;
#include <iostream>
using namespace std;
int main()
{
struct Student//声明一个结构体类型 Student
{
int num;
string name;
int age;
};
Student s;
Student* p = &s;
}
另外,在这里我们可以在注意到:
在引用结构体类型申明变量和指针的时候,“struct”可以省略
利用指针对结构体进行具体访问
根据我们原来学的(书上的内容),如果我们要访问结构体变量当中(里面)的内容
常用引用符号“.”;例如:“teacher.age”
而在这里我们要介绍的,就是如果我们想要通过指针来访问结构体变量的时候,我们使用:
(指针变量)->(我们想要得到或输出的具体的成员名<属性名>)
例如:
#include <iostream>
using namespace std;
int main()
{
struct Student//声明一个结构体类型 Student
{
int num;
string name;
int age;
};
Student s = {23};
Student* p = &s;
cout << p->age;
}