我眼中的C语言
作者:互联网
计算机程序
计算机程序是一组计算机能识别和执行的指令的集合。计算机的一切操作都是由程序控制的,计算机帮助人们解决实际问题的过程就是一个执行具体程序的过程。
计算机内存
现代计算机的主要部件:中央处理单元(CPU)担负着绝大部分的计算工作;随机访问存储器(RAM)作为一个工作区来保存程序和文件;永久存储器,一般是硬盘,负责永久地保存程序和文件;各种外围设备(如键盘、鼠标、显示器)用来实现人机之间的数据通信。
中央处理器CPU是进行数据计算的核心部件,它从内存中获取一个指令并执行该指令,然后从内存中获取下一条指令并执行。计算机程序可以分解成若干条CPU可以识别的指令,CPU执行计算机程序,就是依次执行程序对应每一条指令的过程,就是一个不断地从内存读取数据、处理数据、往内存中写回数据的过程。
计算机程序执行时,组成程序的指令以及指令要处理的对象(数据)都必须存储到某个特定的位置,这个计算机内特定的存放位置就是内存,也成为主存,或者随机访问存储器。内存是易失性存储器,关闭电脑后,内存中的数据就会丢失。因此,在关闭电脑之前,需要先将内存中需要保存的数据写入到外存中。
内存中的位只有两个状态,0和1。为了数据更加方便,内存中的位以8个为一组,每组的8位称为一个字节byte。为了识别内存中的不同字节,根据这些字节在内存中的先后位置,依次对每个字节进行标识:一个字节用0表示,第二个字节用1表示,直到内存中的最后一个字节。字节中的这种内存位置的标记称为字节的地址。每个字节的位置都是唯一的,不同的字节地址表示了内存中不同的存储位置。
计算机内存存储容量的常用是千字节,兆字节,吉字节。
1 KB = 1024 B
1 MB = 1024 KB
1 GB = 1024 MB
C语言简介
C是一个很小的内核语言,只包含极少的与硬件有关的成分,C语言不直接提供输入和输出的语句、有关文件操作的语句和动态管理内存的语句(这个操作都是编译系统提供的库函数实现的)。
C允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。
算法设计基础
程序设计的基本目的是让计算机按照用户设定的执行流程完成数据处理的任务,因此,设计一个程序首先要解决两个问题:对什么样的数据进行处理,如何对数据进行处理。
1,对什么样的数据进行处理,是指要明确程序处理的对象,并指明该处理对象的合理表示方式。如在程序中根据需求,合理地确定需要处理对象的数据类型、明确多个数据元素之间的相互关系,并合理组织数据的存储结构等。这些都属于数据结构(Data Structure)讨论和解决的问题。
2,如何对数据进行处理,指要明确对处理对象的操作流程,也就是确定计算机在处理过程中每一阶段的操作任务以及这些操作的先后顺序。
程序设计中常用的算法
1,迭代法
迭代法,是一种不断用变量的旧值递推新值的过程,也是计算机解决问题的一种基本方法。迭代法利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令进行重复执行,在每次执行这组指令时,都会从变量的原值推出一个它的新值。
2,穷举搜索法
它是基于计算机特点而进行解题的思维方法。一般是在一时无法找到解决问题的更好途径时,可以根据问题中的部分条件(约束条件)将所有的可能解的情况都列举出来,然后一一验证是否符合问题的要求,从而得到问题的解。
3,递推法
递推法是利用问题本身所具有的一种递推关系求问题解的一种方法
4,递归法
能使用递归描述的算法有这些特征:为求解规模为N的问题,设法将它分解成规模更小的问题,然后从这些小问题的解中得到大问题的解,并且这些规模更小的问题也能采取同样的分解和综合方法,分解成规模更小的问题。特别的,当规模N=1时,能直接得解。
5,回溯法
6,贪心法
贪心法是一种不追求最优解,只希望得到较为满意解的方法。贪心一般可以快速得到满意的解,因为它省去了寻找最优解的时间。贪心常以当前情况为最优解,而不考虑整体情况。
7,分治法
任何一个可以用计算机求解的问题所需的计算时间都与其规模N有关。问题的规模越小,越容易求解,解题所需的时间也越少。
分治法的设计思想是,将一个难以解决的问题,分割成一些规模较小的问题,以便逐个击破,分而治之。
如果原问题可以分解成k个小问题,且这些小问题都有解,并可用这些小问题的解,求出原问题的解,那么这种分治法就是可行的。反复应用分治法可以使得子问题与原问题的类型一致,并且规模减少,这个过程自然导致递归的产生。因此,递归和分治,总是在一起解决问题。
8,动态规划法
经常会遇到复杂问题不能分解为几个子问题,而是分解成一系列的子问题。简单地把大问题分解成子问题,并综合子问题的解导出大问题的解的办法,问题求解耗时成几何倍数上涨。
为了节约重复求解相同子问题的时间,引入一个数组,不管它们是否对最终解是否有用,都存入数组中,这就是动态规划的常用方法。
函数
C程序的全部工作都是由各种各样的函数组成的,程序的主题也是一个main函数,因此也称C语言为函数式语言。函数是C语言中模块化程序设计的最小单位,是用于完成特定任务的小程序。
C程序的设计原则是采用函数模块结构,使得程序的结构清晰,便于程序的书写。
函数的声明
函数声明时,函数的定义可以在主调函数前面,也可以在主调函数后面。由于C语言要求先定义后调用,如果主调函数在函数定义的后面,那么函数定义可以省略;如果主调函数在函数定义的前面,就需要在函数调用前加上函数原型的声明。
变量与函数
变量的作用域是指变量能够起作用的程序范围,从作用域的角度区分,变量可以分为局部变量和全局变量。
如果一个变量在某一个时间范围内在内存中一直存在,则这一段时间称为该变量的生存期。一个变量若在整个程序的运行期间一直存在,此变量称为静态变量;若一个变量只在某函数执行过程中才存在,此变量称为动态变量。静态变量存放在内存的静态存储区,动态变量存放在内存的动态存储区。
指针的作用
指针类型是C语言广泛使用的一种数据类型,也是C语言的特色之一。使用指针的好处在于:
- 使用指针,可以更加直观的表示各种复杂的数据结构
- 能对计算机的内存管理进行控制,实现动态的内存分配和回收
- 通过指针变量作为函数参数,能够使函数之间的数据传递更加简单高效
地址和指针
程序和数据都是在内存中存储的,计算机的内存是以字节为基本单位的一片连续的内存空间。为了正确地访问这些内存空间中的数据,系统以字节为单位对内存空间进行编号,不同的编号表示不同的内存位置。程序运行时可以根据编号准确找到对应存储单元的位置,并对该存储位置中的内容进行读写,这种对内存的编号被称为内存地址。
变量的值和变量的地址
变量的地址是程序编译阶段通过内存单元分配的方式由系统确定的,一旦确定后,不能进行修改。变量的值是程序运行阶段,通过初始化或者赋值语句的方式由程序员确定的。
变量的访问方式
对变量进行访问,其目的是对变量的值进行访问和读写,但是单纯的变量符号并不具有值的存储功能。只有通过变量定义,为变量分配了存储单元,才能建立变量符号和存储单元的联系。
1,直接访问
通过变量名完成对内存单元的存取操作:程序给出变量名,经过编译系统编译后会转换得到该变量对应内存单元的地址,进而进行存取操作。
2,间接访问
- 第一次访问该变量对应的内存单元,从中取到存放的数据,该数据是其他内存单元的地址值
- 第二次是通过第一次所取得的地址值,找到该地址对应的另一个内存单元,得到其中的数据
指针变量
指针变量同普通变量一样,使用之前要定义说明,且要赋予初值。未经赋值之外的指针变量不能进行赋值之外的其他引用操作,否则会造成系统混乱。指针变量只能赋予地址,绝不能赋予其他数据,否则将会引发错误。在C语言中,地址都是由编译系统分配的,对用户透明,用户无法预知系统为变量分配的具体地址。
&:取地址符
*:指针运算符
指针变量初始化的两种方法:
方法一:
int a;
int *p = &a;
方法二:
int a;
int *p;
p = &a;
指针变量作为函数参数
普通变量作为函数参数时,函数的形参和实参是不同的两个变量,操作系统会为之分配不同的内存单元。函数调用时,实参与对应的形参会发生联系,但是两者的联系仅发生在函数调用指出,这是实参的值传给形参,传值完成后,两者没有直接联系。换言之,形参变量的值,如果在函数调用过程中发生改变,将不会影响对应的实参。
函数调用过程中,改变指针变量的值,实参无影响;改变指针变量所指变量的值,实参的值也会发生改变。
指向数组的指针变量
所谓数组的指针是指数组的起始地址,数组元素的指针就是数组元素的地址。
返回指针值的函数
定义返回指针值函数的一般格式:
类型说明符 * 函数名(形参表)
{
//函数体
}
标签:函数,C语言,问题,内存,字节,眼中,变量,指针 来源: https://blog.csdn.net/qq_43057549/article/details/112133628