结构体的基本用法及特点
结构体:
是一种数据类型,是构造类型,里面可以存放不同类型的数据.
用于封装不同的数据类型到一个结构体中,方便使用.
#include <stdio.h>
int main() {
//定义结构体
struct Person{
char* name;
int age;
};
//定义结构体变量及赋值:
struct Person p1={"itheima",18};
//取值:
printf("name=%s---age=%d\n",p1.name,p1.age);
//运行结果:name=itheima---age=18
//赋值:
p1.name="itcast";
p1.age=20;
printf("name=%s---age=%d\n",p1.name,p1.age);
//运行结果:name=itcast---age=20
return 0;
}
特点:
1.可以定义结构体类型时同时定义结构体变量名,可定义匿名类型结构体.
2.同义作用域内不可重复定义结构体类型和结构变量,匿名类型结构体除外.
3.可在函数内也可在函数外,效果及用法类型于局部变量和全局变量,也可嵌套定义.
4.可同时在函数内外定义同一个类型,使用同样遵循就近原则,结构体变量也是如此.
#include <stdio.h>
int main() {
//基本的定义方式
struct Person{
char* name;
int age;
};
struct Person per={"itcast",20};
//第二种定义方式:
struct Person1{
char *name;
int age;
}per1={"itheima",18};
//第三种定义方式:
struct Person2{
char *name;
int age;
}per2;
per2.name="zhangxue";
per.age=19;
//错误一:
// struct Person2{
// char *name;
// int age;
// }per2;
// per2={"itheima",19}; //错误:与数组一样,不可以批量赋值
//错误二:
// struct { //错误
// char *name;
// int age;
// };
// struct per={"ithemia",45};
//第四种方式:匿名类型结构体(注意必须同时初始化变量)
//这种结构体定义方式不能重用
struct {
char *name;
int age;
}per3={"itheima",45};
return 0;
}
结构体的数组的用法
结构体数组:
是数组,数组的每一个元素都是结构体类型
存储多个有关连的结构体
#include <stdio.h>
int main() {
//定义:
struct Person{
char *name;
int age;
};
struct Person per={"itheima",12};
struct Person per1={"heima",46};
struct Person arr[2]={per,per1};
//取值:
printf("%s----%d\n",arr[0].name,arr[0].age);
//运行结果:itheima----12
return 0;
}
结构体与指针的关系
结构体指针
是指针,指针类型是结构体类型.
用于存储结构体的地址,并操作地址对应的结构体空间的数据
#include <stdio.h>
int main() {
//定义:
struct Person{
char *name;
int age;
};
struct Person per={"itheima",12};
struct Person *p=&per;
//操作:
//取值:
printf("%s----%d\n",(*p).name,(*p).age);
printf("%s----%d\n",p->name,p->age);
//运行结果:
// itheima----12
// itheima----12
//赋值方式:两种
//第一种:
p->name="itcast";
p->age=3;
printf("%s----%d\n",(*p).name,(*p).age);
//运行结果:itcast----3
//第二种:
(*p).name="zhangxue";
(*p).age=45;
printf("%s----%d\n",(*p).name,(*p).age);
//运行结果:zhangxue----45
return 0;
}
特点:
指针移动对结构体本身没有意义,结构体名并不包含第一个元素的地址.
#include <stdio.h>
int main() {
//定义:
struct Person{
char *name;
int age;
};
struct Person per={"itheima",12};
struct Person *p=&per;
char **p1=&per.name;
int *p2=&per.age;
printf("name=%s,age=%d\n",*p1,*p2);
//运行结果:name=itheima,age=12
return 0;
}
结构体的内存分析
结构体分配内存空间遵循两个原则--对齐原则(增加CPU寻址效率)
1.每个元素的偏移量(当期元素首地址距离整个数组首地址的字节数)必须是自己所占字节数的整数倍.如果不够,补齐上一个元素的字节数.
2.整个结构体的字节数必须是其最大元素所占字节数的整数倍,如果不够,最后一个元素填充字节.
#include <stdio.h>
int main() {
struct Person{
char *name;
int age;
};
printf("%lu\n",sizeof(struct Person)); //运行结果:16
return 0;
}
结构体与数组的区别:
1.结构体可以存不同类型的元素,而数组只能存同一类型
2.结构体类型需要我们自已定义.数组是用别的类型加[元素个数]
3.结构体内存分配方式很特别,使用对齐原则,不一定是所有元素的字节数和,而数组一定是所有元素的字节数和.
4.结构体指针可以指针名->结构体元素名(取元素);数组不行.