IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 117-C语言自定义数据类型(struct) -> 正文阅读

[C++知识库]117-C语言自定义数据类型(struct)

1.自定义数据类型的初始化

注意:不能在定义的时候初始化,只有定义完成以后这个变量才算定义完成
int age = 20;//error

struct Student//定义Student数据类型
{
	char name[20];
	int age;
	//int age = 20;//error
};//执行完分号以后说明定义完成,其地位和内置类型一样

int main()
{
	Student stu1 = {"caocao",23};
	Student stu2 = {"liubei"};//只初始化一部分,剩余部分为0
	Student stu3;//没有初始化,值是随机值
}

2.判断下面代码是否合法

①struct A d;是合法的,因为struct A定义完以后,知道了A的大小,其地位和内置类型一样,内置类型可以定义的,struct A就可以定义;

②struct B e;是不合法的,因为struct B还没有完全定义,也就不知道B的大小,struct B要执行完最后的分号以后才算定义完成

③struct B *f;是合法的,虽然B还没有定义完成,但是指针在32位系统里面的大小就是4个字节,它的大小是可以确定的,无论struct B中有多少元素,总大小是多少,指针的大小就是4个字节,所以是合法的

struct A
{
	int a;
	int b;
};

struct B
{
	double c;
	struct A d;//合法
	struct B e;//不合法
	struct B *f;//合法
};

像③这种自己包含自己的结构体指针在数据结构中是很常见的

如:

struct Node
{
	int data;//数据域
	struct Node *p;//指针域,指向下一个节点
};

3.结构体成员的访问

①结构体普通变量通过"."访问其成员

如:要修改stu1的年龄,改为50,答案是:stu1.age = 50;

struct Student stu1 = {"caocao",23};

打印stu1的姓名和年龄信息

printf("%s %d\n",stu1.name,stu1.age);

②结构体指针变量通过"->"访问其成员

struct Student stu2;
struct Student *p = &stu2;//定义了一个学生结构体的指针保存stu2的地址

如:通过指针p将stu2的name改为sunquan,将age改为18

//ps->name = "sunquan";//error//name是一个数组,数组不能整体赋值
strcpy(ps->name,"sunquan");//使用字符串拷贝函数
//(*ps).age = 18;//注意必须要加(),"."的优先级要大于"*"的优先级,这种写法很不方便,通常用下面的方式
ps->age = 18;//这种方法使用的更多

4.通过变量aa或bb,访问其成员a,b,c,d

struct A
{
	int a;
	double *b;
};

struct B
{
	long *c;
	struct A d;
};

int main()
{
	struct B aa;
	struct B *bb = &aa;
	return 0;
}

答案:

aa是一个普通变量,普通变量访问其成员通过".“来访问
aa.c aa.d.a aa.d.b
bb是一个指针变量,指针变量访问其成员通过”->"来访问
bb->c bb->d.a bb->d.b

注意:用".“还是”->",不是看它的成员是普通变量还是指针变量,看的是"它"本身,如果"它"是普通变量,无论它的成员是普通变量还是指针变量,都用".",同样,如果"它"是指针变量,无论它的成员是普通变量还是指针变量,都用"->"

总之就是我访问我的下一级的时候,只看我是普通变量还是指针变量,和我的下级是什么没有关系

5.如何通过函数打印stu的成员变量的值,如何传参

我们每次打印stu1的变量的时候都需要把stu1按值传递给Show函数的形参,一般来说,结构体的大小都比较大,实参在把数据传给形参的时候是有开销的,会浪费资源

void Show(struct Student stu)//设计不好
{
	printf("%s,%d\n",stu.name,stu.age);
}

//一般情况下打印数据的时候,并不会改变数据本身,所以加一个const修饰,防止误改
voud Show(const struct Student *stu)//通过传指针比较好
{
	printf("%s,%d\n",stu->name,stu->age);
}

int main()
{
	struct Student stu1 = {"caocao",25};
	//printf("%s,%d\n",stu.name,stu.age);
	Show(stu1);//这种设计不好,需要传递的数据太大
	Show(&stu1);//传指针,指针的大小在32位平台大小是固定的,就是4字节
	return 0;
}

注意:结构体进行参数传递时都是传递指针,不传本身,目的就是节约空间

6.结构体数组

结构体数组也是通过数组的下标进行访问,也需要用访问符进行访问

int main()
{
	struct Student stu3[3] = {"caocao",15,"guanyu",18,"sunquan",28};

	//要求,将关羽的年龄修改为38
	stu[1].age = 38;

	//要求,输出stu3的所有内容
	for(int i = 0;i<sizeof(stu3)/sizeof(stu3[0]);i++)
	{
		printf("%s,%d\n",stu[i].name,stu[i].age);
	}
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-30 15:24:34  更:2021-11-30 15:25:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:00:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码