概述
一 要学习结构体,第一步,我们要知道什么是结构体。
首先,结构体是一种聚合数据类型,就像数组一样,它可以存放多个元素。而不同的是,数组只能存放相同类型的元素,而结构体可以存放不同类型的元素。struct tag { number-list } variable-list;
例如,学生信息系统中,每一个学生包括了姓名,性别,学号,年龄等等的信息,
这个时候,我们就可以用一个结构体,来定义一个学生,包括这些所有的元素。
struct Student
{
char *name ;
char *sex;
int number ;
int age;
}student;
二 定义结构体
这就是我们定义的一个结构体了。在这里,我们最结构体的最后的student,是这个结构体的一个变量,当我们在
下面要用到这个结构体时,我们可以直接使用这个变量。例如 student.name = "小明";我们用student这个变量来直接访问我们
定义的这个结构体,通过使用点运算符(.)来实现对结构体内的元素 name 的赋值;
对于定义,结构体可以有省略,以上面的为例,我们也可以写成
就可以用一个结构体,来定义一个学生,包括这些所有的元素。
struct
{
char *name ;
char *sex;
int number ;
int age;
}student[2];
这边省略了标签(tag)部分,这样做就只能使用定义时的这个变量了,无法自己再去定义变量。
而如果省略最后的变量部分,当我们要使用时,就可以自己定义一个变量 struct Student student ,
然后再去使用,比如student.name = "小明";
再看这里定义的变量, student[2] ,没错,这是一个数组, 使用时,student[0] 和 student[1] 都可以写入结构体内容。
如 :student[1] = {“小明”,“男”,1,15};
在定义结构体时,我们还有更简便的方法,这里需要用到 typedef。
typedef struct Student
{
char *name ;
char *sex;
int number ;
int age;
}student;
还是上面的那个结构体,我们用typedef来定义,不同在于,最后的student在这里是类型名,就是类似于 int 的感觉。
三 结构体的访问 关于运算符 “ ->”
我们在使用结构体是,经常会用到 指向符(->),这个运算符作用和点运算符 (.)作用一样,不同在于—>用于指针的传递,
比如我们定义一个指针 student *sb,当我们使用它时,就应该使用->,sb -> name ="小明"。
四 结构体的大小
struct A
{
char a;
int b;
};
问 :对于上面这个结构体,它在内存上大小为多少?
也许你会觉得这很简单,char占1个字节,int占4个字节,答案就是5了。
但是,真的是这样吗??
完全不对,正确答案应该是8。
那么为什么呢?原因就在于结构体存储时需要内存对齐。上面的char类型实际占了4个字节。因为 int 类型占4个字节,这就要求int类型从4的倍数格开始存储,第一格放了一个char类型,系统又分配了3个空格,来使int类型对齐。
再举一个例子
struct B
{
char a;//1+1
short sh;//2
int b;//4
};
这里答案是8,short占2个字节,所以在char类型后需要加一个空格来对齐。
下一个例子
struct C
{
int a;//4
char b;//1+3
};
答案是8.这里要向后对齐。
来一个复杂一点的:
struct D
{
char a;//1+3
struct E
{
char b;//1+3
float c;//4
}e;
};
答案是12,虽然嵌套了结构体,但对齐方法不变,区别在于先对齐嵌套的结构体。
比如这边,我们先对齐的时嵌套的结构体E,然后再对齐外面的char a。
最后
以上就是称心溪流为你收集整理的结构体运用基础的全部内容,希望文章能够帮你解决结构体运用基础所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复