数据类型

C语言中数据类型

1.整型

short:短整型数据,占用2个字节;
unsigned short:无符号短整型数据,占用2个字节;
int:整型数据,占用4个字节;
unsigned int:无符号整型数据,占用4个字节;
long:长整型数据,占用4个字节;
unsigned long:无符号长整型数据,占用4个字节。

2.实型

float:单精度实型数据,占用4个字节,有效数字6~7为;
double:双精度实型数据,占用8个字节,有效数字15~16位;
long double:长双精度实型数据,占用16个字节,有效数据18~19。
(实型只有有符号类型)

3.字符型

char:字符型数据,占用1个字节;
unsigned char:无符号字符型数据,占用1个字节;

4.枚举

在c语言中,枚举类型是一种构造数据类型,它用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。

/*格式
访问修饰符 enum 枚举类型名
{
	成员1,
	成员2,
	...
}
注意:
1、enum :是枚举的关键字
2、枚举和int一样,只不过int是系统提供的基本数据类型,而枚举是自定义类型
3、枚举第一个成员默认是0;而后的成员累加一;第一个成员可以自定义。
*/
#include<stdio.h>
enum DAY
	{
		Mon=1,
		Tue,
		Wed,
		Thur,
		Fri,
		Sat,
		Sun
	};
int main()
{
	enum DAY day;
	for(day=Mon;day<=Sun;day++)
	{
		printf("today is %d\n",day);
	}
	return 0;
}

5.数组

数组是用来存储多个相同数据类型的集合,之后会单写一片来记录总结数组。

6.指针

c语言中,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的地址内存地址。CPU通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位,这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,他们都有一个自己的地址,而地址便是保存这个地址的变量。也就是说:**指针是一种保存变量地址的变量。
(之后会写一篇博客来总结指针)

7.结构体

由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构体。
(1)结构体的定义与声明
结构体的定义如下所示,struct为结构体的关键字,tag为结构体的标志,member-list为此结构体成员列表,其列表必须列出所有成员;variable-list为此结构体声明的变量。

struct tag{
member-list
}variable-list;

在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。以下为示例:

//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//同时又声明了结构体变量s1
//这个结构体并没有标明其标签
struct{
int a;
char b;
double c;
}s1;

//结构体的标签被命名为SIMPLE
//用SIMPLE标签的结构体声明了变量t1,t2,t3
struct SIMPLE{
int a;
char b;
double c;
};
struct SIMPLE t1 ,t2[20], *t3;
//这两种声明被编译器当作两种完全不同的类型,即使他们的成员列表是一样的,如果令t3=&s1,则是非法的。
//第三种声明,可以用typedef创建新的类型
//可以用Simple作为类型声明新的结构体变量
typedef struct {
int a;
char b;
double c;
}Simple2;
Simple2 u1,u2[20],*u3;

结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构,如链表和树等。

//此结构体的声明包含了其他结构体
struct COPMLEX{
char string[100];
struct SIMPLE a;
};
//此结构体的声明包含了指向自己类型的指针
struct NODE{
char string[100];
struct NODE *next_node;
};

如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明,如下所示:

struct B;
//对结构体B进行不完整声明
//结构体A中包含指向结构体B的指针
struct A{
struct B *partner;
//other members;
};
struct B{
struct A *partner;
//other members;
};

(2)结构体的大小与内存对齐
结构体的大小不是结构体元素单纯相加就行,因为我们的主流计算机使用的都是32bit字长的CPU,对这类型的CPU取 4字节的数比取一个字节要高效,也方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。每个特定平台上的编译器都有自己的默认“对齐系数”(也叫齐模数)。程序员可以通过预编译命令 #pragma pack(n), n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
规则:
a、数据成员对齐规则:结构体struct或联合体union的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照 #pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
b、结构体或联合体的整体对齐规则:在数据成员完成各自的对齐后,结构体或联合体本身也要进行对齐,对齐将按照 #pragma pack指定的数值和结构体或联合体最大数据成员长度中,比较小的那个进行。
c、结合a、b可推断:当 #pragma pack的n值等于或超过所有成员长度的时候,这个n值的大小将不产生任何效果。

8.共用体/联合体union

在进行某些算法的C语言程序编程的时候,需要使几种不同类型的变量存放到同一内存单元中。也就是使用过覆盖技术,几个变量互相覆盖。这种几个不同变量共同占用一段内存的结构,在C语言中,称作“共用体”类型结构,也叫做联合体。

union member{
int age;
char *name;
};
union member fary;
fary.name="fary";
fary.age=22;
printf("%s\n",fary.name);

输出的结果是:

这里出现了段错误,是因为fayr.age=22;这里对共用体fary重新复制覆盖了name成员。

总结

掌握数据类型是入门c语言的基础,后面的路还很长,加油!!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值