c语言之数据类型

本文介绍了C语言中的数据类型,包括基本数据结构、数组、结构体、共用体和枚举类型。详细讨论了数组和结构体的声明、赋值以及内存分配,并提到了自定义类型的概念。数组作为函数参数时传递的是起始地址,结构体则允许组合多种数据类型,共用体在同一时刻只存储一种类型的数据。枚举类型用于限定变量的取值范围,自定义类型通过typedef提供类型别名。

数据类型是按照规定形式表示数据的一种方式, 不同的数据类型占用内存空间也不同。c语言分为基本数据结构构造数据结构以及自定义数据结构。 我们学习数据类型首先就要先了解数据结构,然后怎么去应用。 所以我们带着以下的问题去学习。

  • 数据结构的分类以及内存大小以及取值范围,
  • 数据结构的使用—–声明以及赋值

问题1:

int  
short
long  // 整数型; 

float
double  // 浮点型

char // 字符型  

//以及 unsigned  signed(表示数据的正负)

#defined 

数据结构分为常量变量 。 数据类型通常要和“量”结合在一起,形成 类型变量或者类型常量

下面是几种常见的基础类型变量以及常量

#define size 32  //  常量,通常也叫 宏定义。
const int a = 3;  // a被定义为常量。
unsigned  long a;   
char b;
double c; 

数据类型的变量有内存大小以及取值范围以及名字

printf("%d\n",sizeof(int));  //   通过sizeof(数据类型)库函数可以查看数据类型的占据内存的大小。

这里写图片描述

int a;  //声明 整数型变量
printf("%d",&a);   //  变量的地址一般通过“&”取地址符来获得。

总结: 上面列举了各种基本类型的种类以及所占内存的大小和基本类型的取值范围。以及变量的取地址方法


问题2:声明以及赋值

int a;  //  声明就是数据类型加标识符 
int a = 3; //声明并且赋值
char b;
double c;
b='A'// 字符变量的赋值
char d[] = "HELLO";  // 字符串可以通过数组来声明。

在练习代码当中,我们有时候常常分不清需要建立多少个变量,这个可能就是对数据结构不熟悉的原因。这个时候我们要学会画程序流程图。 通过程序流程图来一步一步编译。 这样的话就简单的多了。


数组

数组: 多个相同数据类型的集合。

int a[10];  
float b[5];
char c[20];

int a[10] = {0,1,2,3,4,5,6,7,8,9};  //数组的初始化
// 字符串和普通字符的区别。
char pattern[] = "the";   //数组大小为4;
char pattern[] = {'t', 'h', 'e'};  //数组大小为3;

for(int i = 0; i < 10; i++)
scanf_s("%d",&a[i]);
printf("%d\n",a[i]);   // 数组不能整体引用,必须逐个元素访问。
  • 数组名作函数参数,采用地址传送的方式而不是将数组的所有元素传递到被调函数中,仅是将实参数组的起始地址传递到被调函数对应的形式参数中。
  • 数组名代表数组的起始地址时,使用数组名作为函数参数,形式参数必须是与实参数组基本类型相同的数组或指针。

结构体

结构体: 根据程序的需求而编写的基本数据类型集合。 往往在我们编译程序的时候,需要的不单单是一种数据变量,这个时候就需要建立结构体。 比如说: 需要建立一个个人健康情况检查表。 一个人的健康情况需要通过身高,体重, 性别, 有无病史等等变量来描述,而结构体就是用来建立这些变量的集合体。


struct data                 //结构体的标识符struct ,    结构体的名字data
{
char name;  //姓名
float weight;  //体重
char sex;       //性别
char disease;    //病史
}data_1;  // 结构体的对象 

void main()
{
printf("%c\n",data.sex);  // 结构体不能整体调用, 只能通过“.”来调用结构体的成员。
}

结构体的内存大小和结构体里的成员变量有关。 通过可以通过sizeof(结构体对象) 来确定结构体的内存大小; 成员函数的存储地址是一节接一个的, 因为各个成员变量的类型不同, 所以会出现内存单元偏移情况。 上述建立的结构体对象的内存大小为: 12 bety;

结构体的内存大小情况有点解释不清楚, 这个得需要多看看。

  • 类型与变量是不同的概念,不要混同。对结构体变量来说,在定义时一般先定义一个结构体类型,然后定义变量为该类型。
  • 对结构体中的成员可以单独使用,他的作用与地位相当于普通变量。
  • 成员也可以是一个结构体变量,从而创建更复杂的数据类型。
struct date
{
int month;
int day;
int year;
};
struct student
{
int num;
char name[20];
char sex;
int age;
date birthday;  // 结构体里面的结构体;
char addr[30];
}student_1,student_2;
  • 不能将一个结构体变量作为一个整体进行输入和输出,只能对结构体变量中的各个成员分别输入和输出。
  • 结构体变量可以通过赋值运算将其值赋给另一个相同类型的结构体变量,实现结构体变量中所有成员内容的赋值。
  • 如果成员本身有属一个结构体类型,则要用若干级成员运算符,一级一级地找到最低一级的成员。
  • 对成员变量可以像普通变量一样进行各种运算。
  • 可以引用成员的地址,也可以引用结构体变量的地址。

公用体

共用体的标识符是 union; 构造形式和结构体差不多。唯一的特殊性是 共用体的内存大小是覆盖的。所以也就是说共用体的大小是成员变量类型中内存占据最大的一个;

union data
{
int i;
char ch;
float f;
}a,b,c;

共用体:各个成员占相同的起始地址,所占内存长度等于最长的成员所占内存。
结构体: 各个成员占不同的地址,所占内存等于全部成员所占内存之和。

  • 同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。
  • 共用体变量中起作用的成员是最后一次赋值的成员。
  • 共用体变量的地址和他的各成员的地址是同一地址。
  • 不能企图引用变量名来得到成员的值;
  • 共用体类型可以出现在结构体类型定义中,也可以定义公用体数组。

枚举数据类型

如果一个变量只有几种可能的值,可以定义为枚举类型。

enum weekday{ sun,moon,tue,wed,thu,fri,sat};  //定义枚举类型
enum weekday  workday;
enum weekday  week_end;  //定义枚举变量
workday = mon;
week_end = sun;  // 他们的值只能是枚举里面的类型。 

自定义类型

自定义类型:通过关键字typeded 来为类型数据起别名。这样做可以更形象的表示数据结构的意义。

typeded int DATA;  // 别名一般都是大写
typeded float REAL;

//定义结构类型
typeded struct
{
int month;
int day;
int year;
}DATE;   //定义成新类型DATE,   
DATE birthday;  // 结构体的对象。 

typedef int NUM[100];  // 定义NUM为整型数组类型
NUM n;   // 定义为整型数组变量。


typedef chahr *STRING;  //定义STRING为字符指针类型
STRING p, s[10]; //p为字符指针变量,s为指针数组。

定义一个新的类型名的方法是:

  1. 按定义变量的方法写出定义(如:int i;);
  2. 将变量名换成新类型名(如;将 i 换成COUNT);
  3. 在最前面加 typedef(如:typedef int COUNT);
  4. 然后可以用新类型名去定义变量。

  • 用 typedef 可以定义各种类型名,但不能用来定义变量。
  • 用 typedef 只是对已经存在的类型增加一个类型名,而没有创造新的类型。
  • typedef 与 # define 有相似之处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值