C语言概述及数据表示
一、如何学好C语言
1. TIOBE
指令能力:解析处理顺序、分支、循环程序的能力
CPU:进行指令的解析与执行,即处理数据
- 解析指令能力很强
- 存储指令与数据的能力很弱
GPU:存储大,计算强,用于机器学习这种不复杂但量大的计算
- 指令能力不强(处理分支、循环(这种逻辑)程序的能力不强)
- 存储能力强,数量多
编程围绕着:找数据,表示数据,操作数据(找读改写)等行为。
C语言非常灵活,被发明出来就是为了帮助人们直接操控硬件、处理数据的。
- 找:C语言提供了变量名(相当于给地址起了个外号,可以理解为:在编译时就吧变量名替换成了地址了)和指针(地址、无名的内存)两种方式找数据。
2. C语言学习路线
标黑为数据结构所需要掌握的。
- C语言表示数据:主要表示数据的容量,例如int、char、有无符号数等
- C语言操作数据:算术运算、位运算、分支、循环
- C语言找到数据:地址 指针
int *p; // 开辟一块名为p的空间,它回答了用多大空间存储地址,怎么用这个地址访问空间
int *p[5]; // 开辟连续的5个空间,使用p访问第一个空间。每个空间都存着“钥匙”(而不是数据),用于指向其他的空间。
int (*p)[5]; // 不加括号的话,p[5]的优先级高于*。为了让地址是5个([]里的数字)5个地访问,要把*p用()括起来,让它们成为一个整体。
int *p(int); //
int (*p)(int); //
char **p; // p往右边看没东西,看左边,第一个*告诉它这是“一把钥匙”,第二个*告诉它这把钥匙要开的门里面装的还是“一把钥匙”。
- C语言数据管理:分段
栈->堆->bss段->data段->rodata段->text段 - C语言的模块化设计思想:函数——承上启下 模块衔接
- C语言编译流程
二、C语言的数据表示
赋值=
:逐位拷贝
int p1; //用一个基础数据类型,叫int,在内存中圈了一块区域,用p1来标记这个区域
- 圈多大?任何编程语言(几乎所有)都要支持圈地的大小,即数据类型。
- 数据类型 : char、short、int、long等
- 提出这些数据类型的目的:约束圈地的范围,C 提供了一个sizeof的关键字来查看这些地的大小。总之就是,定义一个变量时,只是告诉系统我要用多大的一块地。至于后面该怎么去拷贝(赋值)、解码等,那就是后面的事了
- 这些数据类型没有确定的大小,而只是规定了它们的关系,这就导致各厂家的编译器有不同之处。
char < short <= int <= long
其中char必为1,long最少为4B。
面试中问int a; sizeof(a) = ?
,要回答不确定(与当前系统环境有关)。
printf("%d %u")
printf相当于一个解码器,把内存中相同的内容按照不同的方式(%d、%u等)解码输出。