-
-
[分享]C语言基础二-基本数据类型
-
2021-5-11 11:35
4092
-
基本数据类型
C语言中,有四种基本数据类型,分别是整型、浮点型、指针、聚合类型。
- 整型:字符、短整型、整型、长整型,都分为有符号和无符号。
- 浮点型:float、double,C语言中,定义浮点型的关键词是float,后缀为f,如果不加f,使用的时候默认是double类型。
- 指针类型:指针也是一个变量,里面存放的值是一个地址。
- 聚合类型:数组、结构体,数组保存同一数据类型的数据,随机访问速度快。结构体保存不同数据类型的数据,方便数据的管理。
字符和字符串
字符串的存储和交互,一共提出了2种概念:一种是C语言风格的,在字符后面以0结尾,代表是一个字符串;另一种是Pascal风格的,一般用前面两位给定大小,后面存储大小一样的字符,形成一个字符串。
C语言风格的优点是灵活性比较高,特别是在网络通信的时候,只要不是以0结尾,那么可以传输任意的字符;缺点是如果要找第N个字符,那么要一个一个的查找。Pascal风格的优点是长度固定,访问第N个的效率高,可以以跳板的形式访问;缺点是缺乏灵活性。
字符和字符串的区别
'a'和"a"的区别:字符a是可以访问Ascii编码的,字符串a则是引用的字符串的首地址。
C语言中的除法规则
在数学中有向上取整和向下取整,比如3/2=1.5,向下取整就是取不大于自己的最大整数,也就是1;向上取整就是取不小于自己的最大整数,也就是2。C语言中向0取整,使用右移符号时必须要判断商是否为负数。
溢出和进位的区别
- 溢出:针对有符号数据的描述,当数据到达最大值的时候,如果再+1数据就会溢出,有可能变成负数,恢复代价大,也有可能不能恢复。
- 进位:针对无符号数据的描述,当数据大小超过这个数据的范围时,就会产生进位,当前值还是有效的,可以通过一定的手段获得进位数据。
typedef关键字
C语言中,有typedef关键字,这个关键字的作用允许你为类型定义一个新的名字,也就是起个别名。例如:
1 2 | typedef unsigned int DWORD
DWORD name = 0 ;
|
那么以后我们定义unsigned int类型的变量的时候,就不用再写unsigned int,直接写DWORD即可。
typedef关键字一般常用在结构体的定义和函数指针上。例如:
1 2 3 4 5 | typedef struct MyStruct
{
int nNumA;
int nNumB;
}MyStruct, * PMyStruct;
|
那么新的数据类型就是MyStruct,这个类型免去了每次定义的时候都加struct关键字。例如:
1 2 3 4 | / / 定义前
struct MyStruct tagStruct;
/ / 定义后
MyStruct tagStruct;
|
作用域
C语言中,编写的代码有作用域的限制。作用域是什么,简而言之,当我们定义变量的时候,这个变量的访问要在一定区域内才能进行。
函数作用域:比如你在A函数中定义变量nA,在B函数中定义变量nB,那么在B函数中是不能使用变量nA的。例如:
1 2 3 4 5 6 7 8 9 10 | void funA()
{
int nA = 1 ;
printf( "%d\r\n" ,nA);
}
void funB()
{
int nB = 2 ;
printf( "%d\r\n" ,nB);
}
|
其中变量nA、nB的作用域是函数作用域,也就是{ }块语句包含的范围。
代码块作用域:主要靠{ }来区分,例如:
1 2 3 4 5 6 7 8 9 10 11 | int main()
{
int nA = 1 ;
/ / 块语句包围
{
int nA = 2 ;
printf( "%d" ,nA);
}
printf( "%d" ,nA);
return 0 ;
}
|
如果这样定义变量,则nA不会重定义,且{ }中的int nA = 2;在代码执行到}后结束,不再存在。
文件作用域:在代码外面定义的变量,也就是全局变量,全局变量在当前文件的任何一个位置都可以访问。例如:
1 2 3 4 5 6 7 | / / 代码外面声明
int g_nNum = 1 ;
int main()
{
printf( "%d" ,g_nNum);
return 0 ;
}
|
github:https://github.com/0I00II000I00I0I0
bilibili:https://space.bilibili.com/284022506
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。