摘要:
函数设计原则 + 函数从意义上应该是一个独立的功能模块 + 函数名要在一定程序上反映函数的功能 + 函数参数名要能够体现参数的意义 + 尽量避免在参数中使用全局变量 + 如果函数参数不应该在函数体内部被修改时,应该加上const声明 + 如果参数是指针,且仅作为输入参数,则应该加上const声明 + 阅读全文
posted @ 2018-06-22 14:35
烟云123
阅读(1077)
评论(0)
推荐(0)
摘要:
函数与宏 + 宏是由预处理期直接替换展开的,编译器不知道宏的存在 + 函数是由编译器直接编译的实体,调用行为由编译器决定 + 多次使用宏会导致最终可执行程序的体积增大 + 函数是跳转执行的,内存中只有一份函数体存在 + 宏的效率比函数要高,因为是直接展开,无调用开销 + 函数调用时会创建活动记录,效 阅读全文
posted @ 2018-06-22 14:34
烟云123
阅读(213)
评论(0)
推荐(0)
摘要:
递归的数学思想 + 递归是一种数学上分而自治的思想 + 递归需要有边界条件 + 当边界条件不满足时,递归继续进行 + 当边界条件满足时,递归停止 + 递归将大型复杂问题转化为与原问题相同但规模较小的问题进行处理 递归函数 + 函数体内部可以调用自己 + 递归函数 + 函数体中存在自我调用的函数 + 阅读全文
posted @ 2018-06-22 14:34
烟云123
阅读(343)
评论(0)
推荐(0)
摘要:
参数入栈顺序 + 函数参数的计算次序是依赖编译器实现的, 问:函数参数的入栈次序是如何确定的呢? 调用约定 + 当函数调用发生时 + 参数会传递给被调用的函数 + 而返回自会被返回给函数调用者 + 调用约定描述参数如何传递到栈中以及栈的维护方式 + 参数传递顺序 + 调用栈清理 + 调用约定是预定义 阅读全文
posted @ 2018-06-22 14:33
烟云123
阅读(183)
评论(0)
推荐(0)
摘要:
函数参数 + 函数参数在本质上与局部变量相同在栈上分配空间 + 函数参数的初始值是函数调用时的实参值 函数参数的求值顺序依赖于编译器的实现 下面的程序输出什么?为什么? 小结 + 函数的参数在栈上分配空间 + 函数的实参并没有固定的计算次序 + 顺序点是C语言中变量修改的最晚时机 阅读全文
posted @ 2018-06-22 14:32
烟云123
阅读(139)
评论(0)
推荐(0)
摘要:
常见内存错误 + 结构体成员指针未初始化 + 结构体成员指针未分配足够的内存 + 内存分配成功,但并未初始化 + 内存操作越界 内存操作的交通规则 动态内存申请之后,应该立即检查指针值是否为NULL , 防止使用NULL指针。 free指针之后必须立即赋值为NULL。 任何与内存操作相关的函数都必须 阅读全文
posted @ 2018-06-22 14:31
烟云123
阅读(120)
评论(0)
推荐(0)
摘要:
C语言中的函数 函数的由来: 程序 = 数据结构 + 算法 C程序 = 数据 + 函数 函数用来定义算法 函数的意义 模块化程序设计 面向过程的程序设计 + 面向过程是一种以过程为中心的编程思想 + 首先将复杂的问题分解为一个个容易解决的问题 + 分解过后的问题可以按照步骤一步步完成 + 函数是面向 阅读全文
posted @ 2018-06-22 14:31
烟云123
阅读(132)
评论(0)
推荐(0)
摘要:
野指针 + 指针变量中的值是非法的内存地址,进而形成野指针 + 野指针不是NULL指针,是指向不可用内存地址的指针 + NULL指针并无危害,很好判断,也很好调试 + C语言中无法判断一个指针所保存的地址是否合法 野指针的由来 + 局部指针变量没有被初始化 + 指针所指向的变量在指针之前被销毁 + 阅读全文
posted @ 2018-06-22 14:25
烟云123
阅读(231)
评论(0)
推荐(0)
摘要:
程序中的栈 + 栈是现代计算机程序里面最为重要的概念之一 + 栈在程序中用于维护函数调用上下文 + 函数中的参数和局部变量存储在栈上 + 栈保存了一个函数调用所需的维护信息 + 参数 + 返回地址 + 局部变量 + 调用上下文 + ... 函数调用过程 + 每次函数调用都对应一个栈上的活动记录 + 阅读全文
posted @ 2018-06-22 14:24
烟云123
阅读(106)
评论(0)
推荐(0)
摘要:
程序文件的一般布局 程序与进程 + 程序和进程不同 + 程序是静态的概念,表现形式为—个可执行文件 + 进程是动态的概念,程序由操作系统加载运行后得到进程 + 每个程序可以对应多个进程 + 每个进程只能对应—个程序 思考 面试中的小问题 包含脚本代码的文本文件是—种类型的可执行程序吗?如果是,对应什 阅读全文
posted @ 2018-06-22 14:24
烟云123
阅读(449)
评论(0)
推荐(0)
摘要:
动态内存分配的意义 + C语言中的一切操作都是基于内存的 + 变量和数组都输内存的别名 + 内存分配有编译器在编译期间决定 + 定义数组的时候必须指定数组长度 + 数组长度是在编译期就必须确定的 malloc与free malloc和free用于执行动态内存分配和释放 + malloc所分配的是一块 阅读全文
posted @ 2018-06-22 14:23
烟云123
阅读(124)
评论(0)
推荐(0)
摘要:
函数类型 + C语言中的函数有自己特定的类型 + 函数的类型由返回值,参数类型和参数个数共同决定 + int add(int i, int j)的类型为int(int, int) + C语言中通过typedef为函数类型里命名 + typedef type name(parameter list) 阅读全文
posted @ 2018-06-22 14:22
烟云123
阅读(160)
评论(0)
推荐(0)
摘要:
指针阅读技巧解析 右左法则 + 从最里面的圆括号中未定义的标识符看起 + 首先往右看,再往左看 + 遇到圆括号或者方括号时可以确定部分类型,并调转方向 + 重复2,3步骤,知道阅读结束 复杂指针的阅读 例子1 :复杂指针 int( p1)(int , int ( f)(int )); == p1为指 阅读全文
posted @ 2018-06-22 14:22
烟云123
阅读(146)
评论(0)
推荐(0)
摘要:
思考 为什么C语言中的数组参数会退化为指针? 退化的意义 + C语言中只会以值拷贝的方式传递参数 + 向函数传递数组时: + 将整个数组拷贝一份传入函数?(X) + 将数组名看做常量指针传数组首元素地址 C语言以高效作为最初设计目标 + 参数传递的时候如果拷贝整个数组执行效率将大大下降 + 参数位于 阅读全文
posted @ 2018-06-22 14:21
烟云123
阅读(777)
评论(0)
推荐(0)
摘要:
指向指针的指针 + 指针的本质是变量 + 指针会占用一定的内存空间 + 可以定义指针的指针来保存指针变量的地址值 问题 为什么需要指向指针的指针 + 指针在本质上也是变量 + 对于指针也同样存在传值调用和传址调用 例子1 :重置动态空间大小 c include include int reset(c 阅读全文
posted @ 2018-06-22 14:20
烟云123
阅读(133)
评论(0)
推荐(0)
摘要:
main函数的概念 + C语言中main函数称之为主函数 + 一个c程序从main函数开始执行的 下面的main函数定义正确吗? main函数的本质 + main函数是操作系统调用的函数 + 操作系统总是将main函数作为应用程序的开始 + 操作系统将main函数的返回值作为程序的退出状态 例子1: 阅读全文
posted @ 2018-06-22 14:19
烟云123
阅读(809)
评论(0)
推荐(0)
摘要:
数组指针和指针数组分析 思考 下面这些声明合法吗? 问题: + array代表数组首元素的地址,那么matrix代表什么? + array和&array的地址值相同,但是意义不同,那么它们所代表的类型相同吗 数组类型 + C语言中的数组有自己特定的类型 + 数组的类型由元素类型和数组大小共同决定 例 阅读全文
posted @ 2018-06-22 14:18
烟云123
阅读(128)
评论(0)
推荐(0)
摘要:
字符串的概念 + 字符串是有序字符的集合 + 字符串是程序中的基本元素之一 + C语言中没有字符串的概念 + C语言中通过特殊的字符数组模拟字符串 + C语言中的字符串是以'\0'结尾的字符数组 字符数组和字符串 在C语言中,双引号引用的单个或者多个字符是一种特殊的字面量 + 存储于程序的全局只读存 阅读全文
posted @ 2018-06-22 14:16
烟云123
阅读(174)
评论(0)
推荐(0)
摘要:
典型问题一 下面的程序输出什么?为什么? 分析: snprintf()函数本身是可变参数函数,原型如下: 注意:当函数有3个参数时,如果第三个参数没有包含格式化信息,函数调用没有问题;相反,如果第三个参数包含了格式化信息,但缺少后续相应参数,则程序行为不确定。 典型问题二 下面的程序输出什么?为什么 阅读全文
posted @ 2018-06-22 14:16
烟云123
阅读(138)
评论(0)
推荐(0)
摘要:
问题 数组名可以作为常量指针使用,那么指针是否也可当做数组名来使用呢? 数组的访问方式 + 以下标的形式访问数组中的元素 + 以指针的形式访问数组中的元素 下标形式VS指针形式 + 指针以固定增量在数组中移动时,效率高于下标形式 + 指针增量为1且硬件增量模型时,效率更高 + 下标形式与指针形式的转 阅读全文
posted @ 2018-06-22 14:14
烟云123
阅读(134)
评论(0)
推荐(0)
摘要:
数组的概念 数组是相同类型的变量的有序集合 数组的大小 + 数组在一片连续的内存空间中存储元素 + 数组元素的个数可以显示或隐式指定 例子1:数组的初始化 数组地址与数组名 + 数组名代表数组首元素的地址 + 数组的地址需要用取地址符&才能得到 + 数组首元素的地址值与数组的地址值相同 + 数组首元 阅读全文
posted @ 2018-06-22 14:13
烟云123
阅读(168)
评论(0)
推荐(0)
摘要:
数组的本质 + 数组是一段连续的内存空间 + 数组的空间大小为sizeof(array_type) array_size + 数组名可以看做指向第一个元素的常量指针 指针的运算 指针是一种特殊的变量,与整数的运算规则为 p+n; (unsigned int)p + n sizeof( p); 结论 阅读全文
posted @ 2018-06-22 14:13
烟云123
阅读(132)
评论(0)
推荐(0)
摘要:
变量回顾 + 程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段存储空间? 思考 下面的程序输出什么?为什么 号的作用 + 在指针声明时, 号表示所声明的变量为指针 + 在指针使用时, 号表示取指针所指向的内存空间中的值 例子1:指针使用分析 传值调用和传址调用 + 指针是变 阅读全文
posted @ 2018-06-22 14:12
烟云123
阅读(151)
评论(0)
推荐(0)
摘要:
\ 运算符 + \ 运算符用于在预处理期将宏参数转换为字符串 + \ 的转换作用是在预处理期完成的,因此只在宏定义中有效 + 编译器不知道 的转换作用 例子1: 运算符的基本用法 例子2:运算符的妙用 \ \ 运算符 + \ 运算符用于在预处理期粘连两个标识符 + \ 的连接作用是在预处理期完成的, 阅读全文
posted @ 2018-06-22 14:11
烟云123
阅读(374)
评论(0)
推荐(0)
摘要:
\ pragma简介 + \ pragma用于指示编译器完成一些特定的动作 + \ pragma所定义的很多指示字是编译器特有的 + \ pragma在不同的编译器间是不可移植的 + 预处理器将忽略它不认识的\ pragma指令 + 不同的编译器可能以不同的方式解释同一条\ pragma指令 + 一 阅读全文
posted @ 2018-06-22 14:10
烟云123
阅读(760)
评论(0)
推荐(0)
摘要:
\ error的用法 + \ error用于生成一个编译错误消息 + 用法:error message(不需要用双引号包围) + \ error编译指示字用于自定义程序员特有的编译错误,消息类似的 + \ warning用于生成编译警告 + \ error是一种预编译器指示字 + \ error可用 阅读全文
posted @ 2018-06-22 14:07
烟云123
阅读(352)
评论(0)
推荐(0)
摘要:
基本概念 + 条件编译的行为类似于C语言中的if...else... + 条件编译是预编译指示命令,用于控制是否编译某段代码 条件编译的本质 + 预编译器根据条件编译指令有选择的删除代码 + 编译器不知道代码分支的存在 + if...else...语句在运行期进行分支判断 + 条件编译指令在预编译期 阅读全文
posted @ 2018-06-22 14:06
烟云123
阅读(1195)
评论(0)
推荐(0)
摘要:
C语言中的宏定义 + \ define是预处理器处理的单元实体之一 + \ define定义的宏可以出现在程序的任意位置 + \ define定义之后的代码都可以使用这个宏 定义宏常量 + \ define定义的宏常量可以直接使用 + \ define定义的宏常量本质为字面量 下面这些宏常量定义正确 阅读全文
posted @ 2018-06-22 14:03
烟云123
阅读(1136)
评论(0)
推荐(0)
摘要:
问题 工程中的每个c语言源文件被编译后生成目标文件,这些目标文件如何生成最终的可执行文件? 链接器的意义 链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块能够正确的衔接 模块链接 静态链接 由链接器在链接时将库的内容直接加入到可执行程序中 Linux下静态库的创建和使用 + 编译静 阅读全文
posted @ 2018-06-22 14:01
烟云123
阅读(183)
评论(0)
推荐(0)
摘要:
被隐藏了的事实 初识编译器 编译器做了什么 预编译 + 处理所有的注释,以空格代替 + 将所有的 define删除,并且展开所有的宏定义 + 处理条件编译指令 if, ifdef, elif, else, endif + 处理 include,展开被包含的文件 + 保留编译器需要使用的 pragma 阅读全文
posted @ 2018-06-22 13:59
烟云123
阅读(125)
评论(0)
推荐(0)

浙公网安备 33010602011771号