1、在C语言中,除了之前学到的基本数据类型(整型<short,int,long>,浮点型<float,double>,字符型<char>)外,还有指针类型和构造类型(结构型<struct>,联合型<union>,枚举型<enum>)。
2、结构体类型,用于把不同类型的数据组合成一个集合体,声明格式:
struct 结构名{
数据类型1 成员名1;
数据类型2 成员名2;
… …
数据类型n 成员名n;
};
例如:
#include<stdio.h>
struct students{
char name[20];
int age;
char ID[10];
// …… (其他类似)
};
void main()
{
//定义结构体的变量,如本处定义变量为stu
struct students stu;
//访问结构体变量的某个成员的格式为:结构变量名.成员名
printf("输入学生姓名:");
scanf("%s",stu.name);
// …… (其他类似)
}
结构体的特点是:①表示更丰富的复杂类型,是类的起源
②内部属性定义的顺序不影响使用,但影响内存分配
③关键认识点在于内存大小的对齐,如在上述例子中,sizeof(stu)=36,是因为在32位操作系统中按4个字节对齐
3、共用体(联合体),即用覆盖技术,让几个不同类型的成员变量共享同一存储区,定义联合体的语法:
union 公用体名{
数据类型 成员名;
数据类型 成员名;
… …
}共用体变量名;
例子:
#include<stdio.h>
union score{
int point;
char level;
};
void main()
{
union score myScore;
myScore.point = 80;
printf("%d\n",myScore.point);
myScore.level = 'A';
printf("%c\n",myScore.level);
printf("%d\n",myScore.point);
printf("%d\n",sizeof(myScore));
}
在上面例子中,point和level共享同一存储区,所以sizeof(myScore)的值是数据类型中比较大的那个,这里是int型的4个字节。在给level赋值了之后,上面的point的值就不再是80,而是A的ASCII码值65。
公用体的特点:①同一个内存区域可以存放不同数据类型(非常少见)
②内部属性的定义不影响使用也不影响内存分配
③操作了一个属性,其他属性也发生相应变化;因为它们在同一内存地址
3、枚举类型,即把这种数据的类型可取的值一一列举出来,一个枚举型的变量的取址仅限于列出值得范围。声明的语法:
enum 枚举名{
标识符[=整型常数],
标识符[=整型常数];
… …
};
例子:
#include<stdio.h>
enum season{
spring,
summer,
autumn,
winter
};
void main()
{
enum season now;
now = spring;
printf("%d\n",now);
}
枚举类型的特点:①某些特定类型取值是固定的几个值,所以需要枚举
②枚举定义时括号中的不是属性,而是值的符号。
③改变值符号的顺序,影响使用(值发生变化,除非用赋值符号写死),不会改变内存分配。
4、指针类型,指针类型的变量专门用来存储某个变量的的内存地址,声明语法:
只想的变量的类型名 *指针变量名;
例子:
#include <stdio.h>
void main()
{
//普通变量
double d = 3.14;
//指针变量
double *p = &d;
printf("变量d当中存放的值:%lf\n",d);
printf("变量d的地址:%d\n",&d);
printf("变量d的空间大小:%d\n",sizeof(d));
printf("指针p的空间大小:%d\n",sizeof(p));
printf("指针p的值:%d\n",p);
printf("指针p的地址:%d\n",&p);
printf("指针所存放地址所代表空间的值:%lf\n",*p);
}
指针类型的特点:①double不代表p的类型,p是指针类型大小固定;它代表的是指针p指向的内存区域是一个double
②*是申明指针变量的标志
③变量名p可以任意命名