C语言概述和数据类型例题与虚拟空间

来源:互联网 发布:淘宝上卖aj高仿的店铺 编辑:程序博客网 时间:2024/06/06 05:08
C语言之父:丹尼斯·里奇
C语言的特点:①可移植性强,适用于不同的硬件平台
②简洁紧凑,使用灵活的语法机制,并能直接访问硬件(体现在效率上)
③具有很高的运行效率
汇编语言:不能实现一些复杂功能,但其访问硬件的效率高(对硬件的初始化一般使用汇编语言,对硬件进行复杂操作的时候使用C语言)






为什么选择C语言?
操作系统的内核使用的都是C语言,需要做开发的话则需要使用C语言进行开发。C语言的可移植性强。比如说以冰箱为例,若冰箱使用的控制语言为java,如果我们我们将java拿出来,让它去控制其他的器件,那么会出现许多问题,倘若冰箱一开始使用的便是C语言,那么将代码取出去控制其他的冰箱的时候,则会成功控制,从而体现了C语言的移植性强的特点;C语言还简洁紧凑,并且能直接访问硬件。说到直接访问硬件,可能会想到汇编,就会问为什么不使用汇编语言,汇编语言访问硬件的效率更高啊?首先汇编语言的确访问硬件的效率最高,但是汇编进行复杂操作的时候没有C语言高效,对于复杂操作C语言可以用很少的代码数量来解决,而汇编则需要很繁琐的代码;最后C语言还有很高的运行效率。举个例子来说,用户就是我们自己,操作系统比作图书馆的阿姨,硬件就比做是我们所要查找的书,我们去图书馆找书的时候,我们并不熟悉图书馆的内部结构和所要找的书在哪个具体的位置,于是我们寻求阿姨的帮助,阿姨很熟悉图书馆,于是就很快的找到了书。操作系统的内核就是使用的是C语言,从而可以看出C语言具有运行效率。

面向结构:解决具体事务(追究实现原理)
面向对象:①解决宏观事务(追究实现结果)②代码具有复用性(指可直接调用),扩展性(指加入新功能时,不需要修改代码),维护性(指当代码出错时,可直接看出错误在第几行)
C语言的标准:①K&RC ②ANSI C/C89标准 ③C99标准 ④C11标准
C89/C90标准的指导原则是:
1、相信程序员;
2、不妨碍程序员做需要完成的事情;
3、让语言保持短小简单;
4、只提供一种方法来执行一种操作;
5、使程序运行速度快,即使不能保证其可移植性。(不追求定义的抽象统一,更优先考虑运行效率)
C89/C90对K&R C的改变有:
0、增加了函数原型(prototype),强调对函数的输入参数进行严格的类型检查;并补充定义了C语言的标准函数库
1、删除了关键字:entry(条目/入口)
2、增加了关键字:const(常型变量)、enum(枚举类型)、signed(有符号的,例如signed char)、void(空/无,可用于函数返回值和形参、通用指针类型)、volatile(易变变量,防止编译器错误的优化)
3、传递结构:允许将结构本身作为参数传递给函数(原来只允许传地址)
4、函数原型:增加了函数原型(便于编译器进行类型检查)
5、增加了预处理指令:#elif(else if)、#error(错误,强制编译停止)、#line(修改当前行号和源文件名)、#pragma(附注/编译指令,编译器定义的与实现有关的指令)
6、定义了固有宏:__LINE__(当前行号)、__FILE__(源文件名)、__DATE__(当前系统日期)、__TIME__(当前系统时间)、__STDC__(标准C版时为1)
C99的修订目标主要有三点:
1、支持国际化编程,引入了支持国际字符集Unicode的数据类型和库函数;
2、修正原有版本的明显缺点。如整数的移植方法,例如int8_t、int16_t、int32_t和int64_t等类型;
3、针对科学和工程的需要,改进计算的实用性。例如添加了复数类型和新数学函数。
C11相比C99的变化
1.对齐处理操作符 alignof,函数 aligned_alloc(),以及 头文件 <stdalign.h>。
2. _Noreturn 函数标记,类似于 gcc 的 __attribute__((noreturn))。例子:
_Noreturn void thrd_exit(int res);
3. _Generic 关键词,有点儿类似于 gcc 的 typeof。例子:
#define cbrt(X) _Generic((X), long double: cbrtl, \
default: cbrt, \
float: cbrtf)(X)
4. 静态断言( static assertions),_Static_assert(),在解释 #if 和 #error 之后被处理。例子:_Static_assert(FOO > 0, "FOO has a wrong value");
5. 删除了 gets() 函数,C99中已经将此函数被标记为过时,推荐新的替代函数 gets_s()。
6. 新的 fopen() 模式,(“…x”)。类似 POSIX 中的 O_CREAT|O_EXCL,在文件锁中比较常用。
7. 匿名结构体/联合体,这个早已经在 gcc 中了,我们并不陌生。
8. 多线程支持,包括:_Thread_local,头文件 <threads.h>,里面包含线程的创建和管理函数(比如 thrd_create(),thrd_exit()),mutex (比如 mtx_lock(),mtx_unlock())等等。
9. _Atomic类型修饰符和 头文件 <stdatomic.h>。
10. 带边界检查(Bounds-checking)的函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s() 等等。更多参考 Annex K。
11. 改进的 Unicode 支持,新的头文件 <uchar.h> 等。
12. 新增 quick_exit() 函数,作为第三种终止程序的方式,当 exit() 失败时可以做最少的清理工作(deinitializition)。
13. 创建复数的宏, CMPLX()。
14. 更多浮点数处理的宏 (More macros for querying the characteristics of floating point types, concerning subnormal floating point numbers and the number of decimal digits the type is able to store)。
15. struct timespec 成为 time.h 的一部分,以及宏 TIME_UTC,函数 timespec_get()。

数据类型:
什么是数据类型?
数据集合的划分,不同数据类型对CPU的意义是不一样的
数据类型的划分:基本数据类型,符合数据类型

华硕例题:
①一个整形数:int a;(整型变量)
②一个指向整形数的指针:int *a;(整型指针变量)
③一个指向指针的指针,它指向的指针是指向一个整型:int **a;(整型指针的指针变量)
④一个有10个整形数的数组:int a[10];(整型数组)
⑤一个有10个指针的数组,该指针是指向一个整型数的:int *a[10];(整型指针数组)
⑥一个指向有10个整型数组的指针:int (*a)[10];(整型数组指针变量)
⑦一个指向函数的指针,该函数有一个整型参数并返回一个整型数:int (*a)(int);(整型函数指针变量)
⑧一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数:int (*a[10])(int);(整型函数指针数组)



例题:
1、int *(*(*fp1)(int))[10]
含义:fp1函数指针变量,该函数指针指向一个形参为int,返回值为数组指针,该函数指针指向一个整型指针函数
2、int *(*(*arr[5])())();
含义:arr为函数指针数组,该数组的元素指向一个形参为空,返回值为函数指针的函数,该函数指针指向一个形参为空,返回值为整型指针
3、float(*(*b())[])();
含义:b为函数,形参为空,返回值是数组指针,该指针指向一个函数指针数组,该数组的元素指向一个形参为空,返回值float的函数
4、void *(*c)(char,int(*)());
含义:c为函数指针变量,指向函数形参为char,函数指针,返回值为void *,该函数指针为形参为空的指针,该指针指向一个形参为空,返回值为整型的函数
5、void **(*d)(int *a,char **(*b)(char *,char **));
含义:d为函数指针变量,指向函数形参为整型指针,函数指针,返回值为void **,该指针指向a变量,返回值为整型,该函数指针中d为一个函数指针,此函数指针指向一个形参为char *,一个形参为一个形参为空返回值为char *的函数,返回值为一个函数指针,该指针指向一个返回值为char *的指针
6、float (*(*e[10])(int *))[5];
含义:e为函数指针数组,该指针函数指向一个形参为int *的函数,返回值为函数指针,该指针指向一个元素为float的数组





强制转化类型
1、隐式类型转化:char<int<flost<double
2、1字节=8bit 半字=2字节=16bit 字=4字节=32bit
3、sizeof()不是函数,是运算符
sizeof在测量数据类型的时候,需要加(),比如sizeof(int)


4、char:1字节 short:2字节 int:4字节 long:4字节 float:4字节 double:8字节
任何类型的指针都是4个字节:操作系统为32位时为4字节,操作系统为64位时为8个字节。在操作系统中,地址的长度是固定不变的,而指针保存的则是地址,所以任何类型的指针都是4个字节
char类型的取值范围:无符号:0~255 有符号:-128~127

有符号与无符号的区别:有符号数和无符号数进行比较运算时(==,<,>,<=,>=),有符号隐式转换成了无符号数

正数原码=补码 常量都有符号

例:
int main()
{
char a[1000];
int i;
for(i=0;i<1000;i++)
{
a[i]=-1-i;
}
printf(“%d\n”,strlen());
return 0;
}


求运算结果?
解析:
无符号时 无符号时
i=0,a[0]=255; i=0,a[0]=-1;
i=1,a[1]=254; i=127,a[127]=-128;
i=255,a[255]=0; i=128,a[128]=127;
i=255,a[255]=0;










strlen()和sizeof()的区别
①sizeof()是运算符,而strlen()为函数
②sizeof()功能是获得保证能容纳实现所建立的最大对象的字节大小,返回长度包括’\0’;strlen()功能是返回字符串的长度,返回的长度大小不包括‘\0’

变量的三大特点:①数据类型:说明变量占用内存空间的大小
②作用域:变量的有效性范围 即:变量的使用范围
③存储类型:变量在内存中的存储方式





MMU:内存管理单元





栈空间特点:先进后出 管理权限:系统
堆空间特点:先进先出 管理权限:用户

声明和定义
声明:不需要内存空间,告知编译器,这个名字已经匹配在一块内存上了,但并未为其分配空间
定义:需要分配空间
0 0
原创粉丝点击