您的位置 首页 设计

C言语的数据类型及其对应变量

C语言的数据类型及其对应变量-初始化标识符iden是定义iden时给iden赋值,一个没有被赋值的iden里面存的是之前这块内存的值,就可能是任意的值,一不小心使用这样的标识符是十分危险的,所以一个好的习惯是定义一个标识符后立即初始化;另外一个原因是常量的值必须在初始化时确定,如果不进行初始化,那么这个常量以后永远都不能赋值了

声明,界说和初始化

声明标识符iden是告知编译器”有这么一个变量var,详细var里是什么,你自己去看”。声明只需求标识符的类型和标识符姓名,C言语的任何标识符在运用前都需求声明,当然变量也不破例;假如标识符的界说代码在运用之前,那么界说的代码能够看作是声明,不然需求声明界说标识符iden是告知编译器”这个iden是什么”;
初始化标识符iden是界说iden时给iden赋值,一个没有被赋值的iden里边存的是之前这块内存的值,就可能是恣意的值,一不小心运用这样的标识符是十分风险的,所以一个好的习气是界说一个标识符后当即初始化;别的一个原因是常量的值必须在初始化时确认,假如不进行初始化,那么这个常量今后永久都不能赋值了
通常情况下,当咱们写int atom=10;时,就一起进行了变量的界说和初始化。

指针

内存便是一排巨细都是一byte,且自己编号的抽屉。编号即抽屉的地址,里边的东西即抽屉的内容

指针即”地址”。即抽屉的编号

指针变量即存储”标识符地址”的变量,即寄存了另一个抽屉编号的抽屉,对指针变量”取值”即得到标识符的地址,即”指针的指向”,对该变量”取址”即该变量自身寄存的地址。当提及指针的时分,必定要留意说的是一个指针常量(一个地址), 仍是一个指针变量,这是国内的教材十分差劲的一个习气

一个指针变量理论上能够存储任何标识符的地址,可是为了便于管理,C言语把指针变量也依照标识符的类型进行了区别。所以有了函数的指针,字符指针,数组指针etc. 但他们其实都相同,即尽管一切的抽屉的编号都是一张纸条,但某个抽屉只用来存储装了苹果的抽屉的编号,另一个抽屉只用来存储装了橘子的抽屉的编号。

界说并初始化一个指针变量,由于运算符优先级的问题,并没有固定的界说格局,根本上每种不同的标识符都有自己的指针界说格局

int* pVar=&var; //数据类型指针变量char (*ptr)[3]={'a','b','c'}; //数组指针变量,本质是指针,指向一个数组 VS char* str[10]={“this”,”is”,”a”,”string”};指针数组,本质是数组,每个元素都是一个指针int (*pFcn)(int x)=fcn; //函数指针变量,指向一个函数的地址,函数名便是一个指针

运用指针

int var2=*pVar;//取值int** ppVar=*pVar;//取址,这儿界说一个指向指针的指针变量

指针常量VS常量指针

指针常量const int* ptr表明不能通过指针修正指向的变量的内容
常量指针int* const ptr表明指针的指向不能改动。

根本数据类型char int etc.

根本数据类型是C言语规定好的数据类型,它们占有内存的巨细,对该块内存的运用方法都是编译器规定好的,咱们只能运用,不能更改。
在一个典型的32位操作体系中:

数据类型占位符长度数值规模(指数表明)数值规模(数字表明)char%c1-2^7~2^7-1-128~127unsigned char%c10~2^8-10~255short%hd2-2^15~2^15-1-32768~32767unsigned short%hu20~2^16-10~65535int%d4-2^31~2^31-1-2147483648~2147483647unsigned int%u40~2^32-10~4294967295long%ld4-2^31~2^31-1-2147483648~2147483647unsigned long%lu40~2^32-10~4294967295float%f或%g4  double%lf或%lg8  

Note:

%f和%lf会保存小数点后剩余的0(就算你写的5.2,也会输出5.200000),而%g和%lg不会保存哪些0

不同渠道(eg:32位VS64位体系)数据类型的长度会有不同,详细需求用sizeof测,上表针对一般32位体系,以int为例,一个int占4byte,一个byte占8位,所以一个int由32位二进制表明,故int共能表明2^32个数

float和double的规模是由指数的位数来决议的。float的指数位有8位,而double的指数位有11位,散布如下:
float: 1bit(符号位) 8bits(指数位) 23bits(尾数位)
double: 1bit(符号位) 11bits(指数位) 52bits(尾数位)
So,float的指数规模为-127~+128,而double的指数规模为-1023~+1024,而且指数位是按补码的方法来区别的。其间负指数决议了浮点数所能表达的绝对值最小的非零数;而正指数决议了浮点数所能表达的绝对值最大的数,也即决议了浮点数的取值规模。
float的规模为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;
double的规模为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308

有符号的数据类型不是分“正数” 和 “负数”,而是 “非负数” 和 “负数”,其间的差异在于 0 对错负数里的,所以,只需求记住有多少个和有无符号就能够核算其规模

根本数据类型与指针

int var=10;int* pVar = &var; //界说并声明一个指向int类型变量的一个指针,并将其指向varint res=*pVar; //对一个指针取值int* pTest=pVar;

字符串

C言语中的字符串用”有用字符”来表明。
C编译器会主动在有用字符之后再加一个\0(即ASCII的数字0)表明字符串的完毕,所以一个字符串实践占用的byte数目是”有用字符数+1″,”Tom”!='T''o''m',前者是字符串,有'\0'结束,占4byte,后者不是”字符串”,而是”一串字符”,没有'\0'结束,占3byte。 有两种方法测验字符串的长度:sizeof和strlen()

界说一个字符串常量

char* str=”this is a string”;

界说一个字符串数组

char str[]=”this is a string”;

字符串与指针

当咱们界说一个字符串常量的时分,C编译器其实干了三件事,1.找一块内存,把这个字符串的有用值放进去,2.字符串的结束加一个'\0',3.把这个字符串的首地址放在标识符中。
C言语的字符串有两种存储方法,字符串常量和字符串数组,二者存储的内容都相同,也都是一个回来字符串的首地址,差异是前者是常量,内存的内容不能修正,后者能够修正。

数组[]

数组是在内存里一块区域里接连的存储数目固定的同一类型数据,这儿的同一类型,既包含根本数据类型,也包含复合数据类型,指针等。一块数组能够用它的数组名仅有的表明,这个数组名其实便是这块内存的首地址,即榜首个元素的首地址。界说数组时,元素的个数从1开端算,拜访数组时,元素的个数从0开端算。所以数组名arr是榜首个元素arr[0]的地址,arr+1是第二个元素arr[1]的地址,留意,arr+1不是第二个byte的地址,编译器会以一个元素所占的byte数为单位进行地址的增减。a[i]的本质便是将地址从a开端移动i个单位长度再解引证,即*(a+i)。
界说一个一维数组

元素类型 数组名[元素的个数];

二维(多维)数组本质上仍是在一块接连的内存中存储数目确认的同一类型数据,只不过对这块数据进行了”分组”,比方,相同的一块存储了1,2,3,4…,9,10的内存,用一维数组表明是int num[10]={1,2,3,4,5,6,7,8,9,10};,而用二维数组表明是int num[2][5]={1,2,3,4,5,6,7,8,9,10};,内存仍是那块内存,只不过表达方法变了,二维数组相当于把这10个数分成了两组,每组5个数

界说一个二维数组

元素类型 数组名[组数][每组元素数]

界说并初始化一个数组

char stu1Name[20]=”Tom”; //界说并初始化字符数组,数组中前4byte被赋值char remark[20]={‘y‘,’e‘,’s‘}; //数组中前3byte被赋值int vector[]={1,2,3}; //假如数组元素悉数列出,能够省掉界说时的元素个数int vector2[][2]={1,2,3,4}; //假如没有歧义,二维数组的榜首维能够省掉,没有赋值的部分会被初始化为'0';

指针数组VS数组指针

指针数组的中心词是”数组”,所以指针数组表明的是里边的成员都是指针类型的数组

int* arr[10]; //arr用来存储10个指向int类型的指针char* strarr[10]; //strarr用来存储10个指向char类型的指针,由于字符串的本质便是char*,所以strarr是存储了10个字符串首地址的数组

数组指针的中心词是”指针”,数组名自身便是一个指针常量,便是榜首个元素的地址

int arr[10] = {1,2,34};int* pArr=arr; //将数组的地址赋值给数组指针

可是数组指针多用在二维数组中,一个int* ptr能够指向int arr[3],可是不能指向二维数组,二维数组指针必定要除了元素类型还要至少标明数组的列数,形如int (*ptr)[3],则这个ptr才能够指向任何一个以int为元素类型,列数为3的数组,当然,也能够一起指定指向数组的行数和列数做进一步的限制。
二维数组指针有行指针和列指针之分

结构体struct

结构体是把不同的数据类型进行打包的一种数据类型,由程序员自己界说。已然说结构体是一种数据类型,而一个数据类型是没有值的,所以结构体在界说时不能进行赋值。
界说一个有名结构体类型,运用变量列表创立变量,运用初始化列表进行初始化

struct StuInfo{ int age; char name[20];}stu1={10,”Tom”},stu2={11,”Rendo”};

界说一个结构体类型,习气大将自界说的结构体类型的首字母大写,以便和变量进行区别

struct StuInfo{ int age; char name[20];};//或typedef struct{ int age; char name[20];}StuInfo2;

界说一个结构体类型的变量并进行列表初始化,列表初始化,即只能在初始化时运用,假如界说变量的时分不必,那么之后就只能逐一元素的赋值。

struct StudInfo stu1={10,”Tom”};//或StudInfo2 stu2={11,”Rendo”};

给结构体变量赋值

stu.age=10;stu.name[0]='T';stu.name[1]='o';stu.name[2]='m';stu.name[3]='\0';

结构体与指针

struct StuInfo* pSt; //界说一个指向结构体StuInfo类型的指针struct StuInfo stu; //界说一个结构体StuInfo类型的变量pSt = &stu; //将结构体变量stu的地址赋给pSt

共用体union

共用体的各个成员同享同一块内存,假如各个成员的长度不同,会取最长的那个成员的长度作为共用体的长度

界说一个union

union Data{ int num1; double num2;};//或typedef union{ int num1; double num2;}Data;

创立共用体变量

union Data{ int num1; double num2;};//或typedef union{ int num1; double num2;}Data;

界说一个共用体变量

union Data data1,data2;//或Data data1,data2;

运用共用体

data1.num1=2;data2.num2=3.3;

枚举enum

望文生义,枚举便是一个一个的罗列,枚举类型用自界说的元从来替代罗列元素的编号,便利回忆,可是其本质上仍是一个整数。
界说一个enum类型weekday

enum weekday{sun,mon,tue,wed,thu,fri,sat};

界说了一个weekday类型的变量

enum weekday day;

运用day变量

day=mon;
 

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/88787.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部