1-C
编程是怎么来到我们这个世界的?
当计算机来到我们这个世界之后,我们希望让计算机为我们做一些事情。但是它们听不懂我们在说什么,所以我们要用它们的语言去与它们进行对话,从而使得它们能够为我们所用。于是编程应运而生。
C历史:
1972-1973 年间,美国贝尔实验室为了描述和实现 UNIX 操作系统(一个具有强大影响力的操作系统,我们实验楼的实验环境 Linux 系统就是一种类 UNIX 系统),于是改良了 B 语言,这就是今天的大名鼎鼎的 C 语言。
C 语言相当灵活,用于执行几乎所有计算机可以完成的任务,既可以用于编写应用程序,还可用于编写操作系统,伟大的 Windows 和 Linux 操作系统的内核就是使用 C 语言开发的。C 语言包含了基本的编程元素,后来的很多语言(C++、Java 等)都参考了 C 语言,说 C 语言是现代编程语言的开山鼻祖毫不夸张,它改变了编程世界。
解释性语言
比如Python或JavaScript写的程序不需要编译成二进制代码。它只是在运行程序的时候在计算机内部Python 解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用 Python 更加简单。由于你只需要把你的 Python 程序拷贝到另外一台计算机上,它就可以工作了,这也使得你的 Python 程序更加易于移植。
①Python被发明的初衷就是能够像shell编程一样简单实现自己的想法,所以在表面上看代码很少,但是它是调用许多的库、函数实现的,在内部需要耗费很多时间去处理;
②Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是运行前直接编译成CPU能执行的机器码,所以非常快。
面向过程与面向对象区别:
面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
其实往冰箱里放东西就是这样的思想:第一步打开冰箱,第二步将东西放入冰箱,第三步关上冰箱,这整个流程下来就是一个过程。而面向过程的语言实际上就是注重于过程的思想。
面向对象:是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
比如拿一个人people来为例,他有各种各样属性,他的身份可能是个老师,年龄大概24岁,爱好打篮球,那么在程序中我们只需要把这些属性封装到people对象中,通过对象people就能够得到对应的属性。
机器语言与机器指令:
低级语言:
高级语言:
编译过程:
编译性语言比如 C 或 C++ 写的程序需要将源代码通过预处理-编译-汇编-链接后,生成计算机可执行的机器码语言(二进制代码,即0和1)。
预处理:展开#include头文件,宏替换、去掉注释、条件编译#if... ...
编译:检查语法,生成汇编语言(.s文件)
汇编:将汇编代码转换为机器码(.o文件)
链接:将各个模块的机器码文件、依赖库连起来生成计算机可执行的文件
汇编的作用:
常量:
字符串常量:
1 char *p = "abcdef"; 2 3 int main() 4 { 5 printf("0x%p\r\n",p);//指针变量存放的第一个字符的地址值 6 printf("0x%X,0x%X\r\n","abcdef", &"abcdef");//字符串常量出现在表达式中, 本身代表它的第一个字符的存放地址 7 printf("%s\r\n",p);//以字符串打印p指针变量,则打印这个字符串存放地址处的字符串 8 printf("%c%c%c%c%c%c\r\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5));//指针所指向的 内存的数据 9 printf("%x\r\n",&p);//指针变量本身的地址 10 }
变量:
常变量:
字符变量:
标识符:
数据类型:
如何确定常量类型:
变量与类型区别:
break与continue:
形参与实参:
递归调用:
局部变量与全局变量:
1). 作用域不同:全局变量的作用域为整个程序,而局部变量的作用域为当前函数
2). 内存存储方式不同:全局变量存储在全局数据区中,局部变量存储在栈区
3). 生命期不同:全局变量的生命期和主程序一样,随程序的销毁而销毁,局部变量在函数内部或循环内部,随函数的退出或循环退出就不存在了
4). 使用方式不同:全局变量在声明后程序的各个部分都可以用到,但是局部变量只能在局部使用。函数内部会优先使用局部变量再使用全局变量
静态存储区与动态存储区:
关键字:Static
Static在C语言里面有两个作用,第一个是修饰变量,第二个是修饰函数。用static修饰变量,不论这个变量是全局的还是局部的都是存储在静态数据区。下面分开来讲:
静态全局变量:其作用域仅限于变量被定义的文件中(即从变量定义处到本文件结尾处),其它文件不论通过什么方式都不能访问。
静态局部变量:
1)在某个函数体里面定义的静态局部变量,只能在本函数体被访问,即使同一个文件的其它函数也访问不了。
2)静态局部变量总存储在静态数据区,所以即使这个函数运行结束,这个静态局部变量的值不会被销毁,函数下次使用时仍然要用到这个值。
静态函数(内部函数),
用来表示不能被其它文件访问的一个函数(和用static修饰全局变量的目的一样,都是不允许其它文件访问)。这样一来便有一个好处:程序员不用担心自己编写的函数与其他文件的函数同名。
extern:
修饰符extern用在变量或者函数的声明前,用来说明 “此变量/函数是在别处定义的,要在此处引用”。
堆栈:
typedef与define
typedef 的真正意思是给一个已经存在的数据类型(注意:是类型不是变量)取一个别名,而非定义一个新的数据类型, 在编译阶段有效
Define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查
声明与定义:
声明:第一重含义:告诉编译器,这个名字已经匹配到一块内存上了,下面的代码用到变量或对象是在别的地方定义的。声明可以出现多次。
第二重含义:告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量名或对象名。
定义:定义创建了对象并为这个对象分配了内存,声明没有分配内存
sizeof
sizeof是关键字,不是函数
在 int 前加 unsigned, const 等关键字但不能加 sizeof。好,记住: sizeof 在计算变量所占空间大小时,括号可以省略,而计算类型(模子)大小时不能省略
sizeof(p)的值是多少?
指针其实就是地址, 与它所指的基类型无关, 更与C语言无关, 只与机器有关.
如果你的机器是16位寻址的, 那指针就是16位的, 如果是32位寻址的, 指针也是32位的.
int a[100];
a是数组名,也是个指针,指向首个元素a[0], 可以说是代表整个数组;sizeof(a)=400
&a是获取指针a的地址,不代表整个数组。sizeof(&a)=4
② 32位编译器的指针变量为4个字节(32位),64位编译器的指针变量为8个字节(64位)。在32位编译器下,使用%p打印指针变量,则会显示32位的地址(16进制的);在64位编译器下,使用%p打印指针变量,则会显示64位的地址(16进制的),左边空缺的会补0。
③ %x、%X和%p的相同点都是16进制,不同点是%p按编译器位数长短(32位/64位)输出地址,不够的补零
posted on 2018-05-02 13:55 Darren_pty 阅读(414) 评论(0) 编辑 收藏 举报