一、结构体类型是一种自定义类型
- c语言有两种类型:原生类型和自定义类型。
二、结构体使用时先定义结构体类型再用类型定义变量
- 结构体定义时需要先定义结构体类型,然后用类型再定义变量。
- 也可以在定义结构体类型的同时定义结构体变量。
- 在函数内部也可以定义类型,但几乎没有人在函数内部定义类型。
#include <stdio.h>
struct people //定义类型
{
name[20];
int age;
}s1; //定义类型的同时定义变量
typedef struct people
{
name[20];
int age;
}s1; //将struct people这个结构体类型重命名为s1,s1是类型名而不是变量名
int main(void)
{
struct people p1; //定义变量
s1.age=23; //结构体变量赋值
printf("s1.age=%d.\n",s1.age);
return 0;
}
三、从数组到结构体的进步之处
- 结构体可以认为是从数组发展而来。数组和结构体是数据结构的范畴了,数组是最简单的数据结构,结构体比数组更复杂些,链表、哈希表比结构体复杂。二叉树、图更复杂些。
- 数组有两个缺陷:一是定义时必须明确给出大小,且定义后不能更改;二是数组要求所有元素类型必须一致。更复杂的数据结构就致力于解决数组的缺陷。
- 结构体就是用来解决数组的第二个缺陷。可以把结构体理解为元素类型可以不相同数组。结构体可以完全取代数组,只是在数组可用的范围内,数组比结构体更简单。
#include <stdio.h>
struct score
{
int a;
int b;
int c;
};
int main(void)
{
int a[3]; //用数组定义三个学生的成绩
score s; //用结构体定义了三个学生的成绩
return 0;
}
四、结构体变量中元素如何访问
- 数组中元素的访问方式:下标方式和指针方式访问。实际上都是指针方式访问。
- 结构体中元素访问:用.或者->方式访问。使用变量名访问用.用指针访问用->
总结:结构体的访问方式本质上还是用指针方式访问。
#include <stdio.h>
struct score
{
int a;
int b;
int c;
};
int main(void)
{
score s; //int *p=s;*(p+0)=12;
s.a=12; //int *p=s;*(p+1)=44;
s.b=44; //int *p=s;*(p+2)=44;
s.c=65; //结构体元素的访问
return 0;
}
#include <stdio.h>
struct mystruct
{
int a;
double b;
char c;
};
int main(void)
{
struct mystruct s1;
s1.a=12; //int *p=(int *)s1;*p=12;
s1.b=4.4; //double *p=(double *)((int)&s1+sizeof(int));*p=4.4;
s1.c='a'; //char *p=(char *)((int)&s1+sizeof(int)+sizeof(double));*p='a';
return 0;
}