C语言日记 28 结构体类型

书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;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值