Darren_pty

导航

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文件)

链接:将各个模块的机器码文件、依赖库连起来生成计算机可执行的文件

 

汇编的作用:

 

 

 常量:

 

 

 

字符串常量:

c语言中没有字符串的类型,所以对字符串操作,有两种形式:可以用字符指针或者字符串数组
在程序中,字符串常量会生成一个“指向字符的常量指针”。当一个字符串常量出现于一个表达式中时,表达式所使用的值就是这些字符所存储的地址,而不是这些字符本身。
因此,你可以把字符串常量赋值给一个“指向字符 的指针”,例如:char *a = "123" ; a = "abc";,后者指向这些字符所存储的地址。
 
但是,你不能把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针,而不是这些字符本身。
例如:char a[5]; a[0] = "a";就是错误的,报错结果:invalid conversion from 'const char*' to 'char'。
例如:char a[10]="love",的意思就是用字符串“love”来初始化字符数组a的内存空间,而数组的首地址也就是“love”字符串的地址
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 前加 unsignedconst 等关键字但不能加 sizeof。好,记住: sizeof 在计算变量所占空间大小时,括号可以省略,而计算类型(模子)大小时不能省略

sizeof(p)的值是多少?

指针其实就是地址, 与它所指的基类型无关, 更与C语言无关, 只与机器有关.
如果你的机器是16位寻址的, 那指针就是16位的, 如果是32位寻址的, 指针也是32位的.

 

int a[100]; 

a是数组名,也是个指针,指向首个元素a[0], 可以说是代表整个数组;sizeof(a)=400
&a是获取指针a的地址,不代表整个数组。sizeof(&a)=4

  

 

 
格式控制符:
%d:按十进制整形类型输出数据
%x:按无符号十六进制整数(字母小写)
%X:按无符号十六进制整数(字母大写)
%p:按十六进制整数方式输出指针的值
 %u: 无符号十进制数输出
 
① 格式控制符“%p”中的p是pointer(指针)的缩写。printf函数族中对于%p一般以十六进制整数方式输出指针的值,附加前缀0x。

② 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  阅读(413)  评论(0编辑  收藏  举报