4.【干货】火爆全网的《超全C精品教程》C 结构体(结构体指针,
结构体的使用大全!
![](https://img.haomeiwen.com/i11218161/91445fe9df48f44f.png)
大纲:
1. 结构体使用和作用
2. 结构体指针
3. 结构体和指针,和联合体的区别
4.结构体数组和结构体偏移
5. 结构体和联合体, 计算他们的大小
---------------------------------------------
结构体的作用:
数组(Array),它是一组具有相同类型的数据的集合。但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。
1.结构体的定义和使用
第一种方式:
struct Worker {// 相当于jav的class
int age;
double salary;
char name[10];
}
struct Worker worker = {10, 1.0, "ddd"};
worker.age =10;
// worker.name="dddd";
stpcpy(worker.name, "ddds"); // 修改char[]
第二种方式:
struct Worker {// 相当于jav的class
int age;
double salary;
char name[10];
}peng, caihua; // 结构体的别名, 会有一个默认初始值
使用!
peng.age =0;
caihua.name;
2.结构体指针和动态内存开辟
结构体可以操作变量, 结构体指针也可以操作变量,2者有什么区别
Worker *workerP = &worker;
workerP->age =24; // 结构体指针,通过箭头方式
常用的方式: 动态申请内存的方式!
Worker *workerHua = (Worker *) malloc(sizeof(Worker));
workerHua->age =0;
结构指针
struct Books *struct_pointer;
struct_pointer = &Book1;
为了使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符,如下所示:
struct_pointer->title;
#include<iostream>
#include<cstring>
usingnamespacestd;
voidprintBook(structBooks*book);
structBooks
{
chartitle[50];
charauthor[50];
charsubject[100];
intbook_id;
};
intmain( )
{
BooksBook1;// 定义结构体类型 Books 的变量 Book1
BooksBook2;// 定义结构体类型 Books 的变量 Book2
// Book1 详述
strcpy(Book1.title,"C++ 教程");
strcpy(Book1.author,"Runoob");
strcpy(Book1.subject,"编程语言");
Book1.book_id=12345;
// Book2 详述
strcpy(Book2.title,"CSS 教程");
strcpy(Book2.author,"Runoob");
strcpy(Book2.subject,"前端技术");
Book2.book_id=12346;
// 通过传 Book1 的地址来输出 Book1 信息
printBook(&Book1);
// 通过传 Book2 的地址来输出 Book2 信息
printBook(&Book2);
return0;
}
// 该函数以结构指针作为参数
voidprintBook(structBooks*book)
{
cout<<"书标题 : "<<book->title<<endl;
cout<<"书作者 : "<<book->author<<endl;
cout<<"书类目 : "<<book->subject<<endl;
cout<<"书 ID : "<<book->book_id<<endl;
}
分析:
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
Books Book1;
printBook( &Book1 );
void printBook( struct Books *book )
{
cout << "书标题 : " << book->title <<endl;
cout << "书作者 : " << book->author <<endl;
cout << "书类目 : " << book->subject <<endl;
cout << "书 ID : " << book->book_id <<endl;
}
解释: 结构体指针式一个地址,对它取地址
结构体不用new出来,他里面放的是int, int也是不用new的.
它在栈区, 自动释放掉, 堆区的内存需要手动释放掉!
strcpy(book->autohor,"修改后的东西");
cout <<"autohor"<<book->autohor <<endl;
cout <<"title"<<book->title <<endl;
cout <<"subject"<<book->subject <<endl;
cout <<"book_id"<<book->book_id <<endl;
};
总结:
3. 结构体和结构体指针的区别
结构体指针保护2部分功能, 1.传递整个对象一样的东西, 2.可以通过指针修改里面的变量!
结构体套指针
比如: 结构体stu. 里面有个char 指针 name! char *name
structstu{
char*name;//姓名
intnum;//学号
intage;//年龄
chargroup;//所在小组
floatscore;//成绩
}
1).联合体和类的区别
结构体设计的意义是什么? (为了解决传递多个参数的问题)
为了解决传递多个参数的问题, C里面是没有对象的!
那用指针可以吗?
不行,指针只是传递内存的地址, 不知道具体的类型. 要有结构体指针!
2).结构体和结构体指针的的区别
结构体可以直接改属性
结构体指针也可以改属性!
2者区别?
3).结构体和类的区别?
1. C是面向过程的,结构体是C中包含的, C++面向对象,所以它需要对象!
结构体是C里边的,类是C++新加的,类有构造函数和析构函数,还引入了封装、继承和多态的概念,比结构体更符合面向对象的设计概念
保留结构体完全是为了兼容C程序,让原本习惯使用C的人不至于一下子不能用
2. C语言中的 struct 只能包含变量,而 C++ 中的 class 除了可以包含变量,还可以包含函数
4.结构体数组的使用
结构体偏移量问题!
结构体可以嵌套
结构体的使用: JNIENV
typedef 关键字
下面是一种更简单的定义结构的方式,您可以为创建的类型取一个"别名"。例如:
typedefstructBooks
{
chartitle[50];
charauthor[50];
charsubject[100];
intbook_id;
}Books;
现在,您可以直接使用 Books 来定义 Books 类型的变量,而不需要使用 struct 关键字。下面是实例:
BooksBook1,Book2;
您可以使用 typedef 关键字来定义非结构类型,如下所示:
typedef long int *pint32;
pint32 x, y, z;
x, y 和 z 都是指向长整型 long int 的指针。
3.结构体和结构体这还能取别名
typedef
4.结构体的大小计算
为什么要知道!
举例: 因为如果是一个结构体数组, 要移动,如何移动?
计算规则:
1). 以最大的计算
2).不足的,进行满算
3)..............
结构体大小计算: 有很多规则:
1.按照最大的字节去计算
2. 算的时候只会按照基本数据类型去算
3. 首先会把所有的字节加起来, 是否能够整除最大属性的字节数,
如果不够为网上累加,一直驾到能整除位置
联合体
在C语言中,变量的定义是分配存储空间的过程。一般的,每个变量都具有其独有的存储空间,那么可不可以在同一个内存空间中存储不同的数据类型(不是同事存储)呢?
答案是可以的,使用联合体就可以达到这样的目
5.联合体的定义和使用
用途: 减少内存, 一般只有一个值!
您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。
定义共用体
为了定义共用体,您必须使用 union 语句,
6.联合体大小计算
共用体占用的内存应足够存储共用体中最大的成员。
https://juejin.cn/post/7038831068618686495
我们首先首先定义一个结构类型,
struct student
{
char *name;
int ages;
};
再根据类型定义结构体变量 struct student stu={"Rose",15};定义一个指针指向结构体类型,struct student *p;把结构体变量stu的地址赋给指针变量p,p=&stu;我们可以有3种方式来访问结构体中的属性ages:
stu.ages=15;
(*p).ages=15;
p->ages=15;
不过第三种方式在C语言中只能用来指向结构体。
===============================================