摘要:
函数设计原则 + 函数从意义上应该是一个独立的功能模块 + 函数名要在一定程序上反映函数的功能 + 函数参数名要能够体现参数的意义 + 尽量避免在参数中使用全局变量 + 如果函数参数不应该在函数体内部被修改时,应该加上const声明 + 如果参数是指针,且仅作为输入参数,则应该加上const声明 + 阅读全文
摘要:
函数与宏 + 宏是由预处理期直接替换展开的,编译器不知道宏的存在 + 函数是由编译器直接编译的实体,调用行为由编译器决定 + 多次使用宏会导致最终可执行程序的体积增大 + 函数是跳转执行的,内存中只有一份函数体存在 + 宏的效率比函数要高,因为是直接展开,无调用开销 + 函数调用时会创建活动记录,效 阅读全文
摘要:
递归的数学思想 + 递归是一种数学上分而自治的思想 + 递归需要有边界条件 + 当边界条件不满足时,递归继续进行 + 当边界条件满足时,递归停止 + 递归将大型复杂问题转化为与原问题相同但规模较小的问题进行处理 递归函数 + 函数体内部可以调用自己 + 递归函数 + 函数体中存在自我调用的函数 + 阅读全文
摘要:
参数入栈顺序 + 函数参数的计算次序是依赖编译器实现的, 问:函数参数的入栈次序是如何确定的呢? 调用约定 + 当函数调用发生时 + 参数会传递给被调用的函数 + 而返回自会被返回给函数调用者 + 调用约定描述参数如何传递到栈中以及栈的维护方式 + 参数传递顺序 + 调用栈清理 + 调用约定是预定义 阅读全文
摘要:
函数参数 + 函数参数在本质上与局部变量相同在栈上分配空间 + 函数参数的初始值是函数调用时的实参值 函数参数的求值顺序依赖于编译器的实现 下面的程序输出什么?为什么? 小结 + 函数的参数在栈上分配空间 + 函数的实参并没有固定的计算次序 + 顺序点是C语言中变量修改的最晚时机 阅读全文
摘要:
常见内存错误 + 结构体成员指针未初始化 + 结构体成员指针未分配足够的内存 + 内存分配成功,但并未初始化 + 内存操作越界 内存操作的交通规则 动态内存申请之后,应该立即检查指针值是否为NULL , 防止使用NULL指针。 free指针之后必须立即赋值为NULL。 任何与内存操作相关的函数都必须 阅读全文
摘要:
C语言中的函数 函数的由来: 程序 = 数据结构 + 算法 C程序 = 数据 + 函数 函数用来定义算法 函数的意义 模块化程序设计 面向过程的程序设计 + 面向过程是一种以过程为中心的编程思想 + 首先将复杂的问题分解为一个个容易解决的问题 + 分解过后的问题可以按照步骤一步步完成 + 函数是面向 阅读全文
摘要:
野指针 + 指针变量中的值是非法的内存地址,进而形成野指针 + 野指针不是NULL指针,是指向不可用内存地址的指针 + NULL指针并无危害,很好判断,也很好调试 + C语言中无法判断一个指针所保存的地址是否合法 野指针的由来 + 局部指针变量没有被初始化 + 指针所指向的变量在指针之前被销毁 + 阅读全文
摘要:
程序中的栈 + 栈是现代计算机程序里面最为重要的概念之一 + 栈在程序中用于维护函数调用上下文 + 函数中的参数和局部变量存储在栈上 + 栈保存了一个函数调用所需的维护信息 + 参数 + 返回地址 + 局部变量 + 调用上下文 + ... 函数调用过程 + 每次函数调用都对应一个栈上的活动记录 + 阅读全文
摘要:
程序文件的一般布局 程序与进程 + 程序和进程不同 + 程序是静态的概念,表现形式为—个可执行文件 + 进程是动态的概念,程序由操作系统加载运行后得到进程 + 每个程序可以对应多个进程 + 每个进程只能对应—个程序 思考 面试中的小问题 包含脚本代码的文本文件是—种类型的可执行程序吗?如果是,对应什 阅读全文
摘要:
动态内存分配的意义 + C语言中的一切操作都是基于内存的 + 变量和数组都输内存的别名 + 内存分配有编译器在编译期间决定 + 定义数组的时候必须指定数组长度 + 数组长度是在编译期就必须确定的 malloc与free malloc和free用于执行动态内存分配和释放 + malloc所分配的是一块 阅读全文
摘要:
函数类型 + C语言中的函数有自己特定的类型 + 函数的类型由返回值,参数类型和参数个数共同决定 + int add(int i, int j)的类型为int(int, int) + C语言中通过typedef为函数类型里命名 + typedef type name(parameter list) 阅读全文
摘要:
指针阅读技巧解析 右左法则 + 从最里面的圆括号中未定义的标识符看起 + 首先往右看,再往左看 + 遇到圆括号或者方括号时可以确定部分类型,并调转方向 + 重复2,3步骤,知道阅读结束 复杂指针的阅读 例子1 :复杂指针 int( p1)(int , int ( f)(int )); == p1为指 阅读全文
摘要:
思考 为什么C语言中的数组参数会退化为指针? 退化的意义 + C语言中只会以值拷贝的方式传递参数 + 向函数传递数组时: + 将整个数组拷贝一份传入函数?(X) + 将数组名看做常量指针传数组首元素地址 C语言以高效作为最初设计目标 + 参数传递的时候如果拷贝整个数组执行效率将大大下降 + 参数位于 阅读全文
摘要:
指向指针的指针 + 指针的本质是变量 + 指针会占用一定的内存空间 + 可以定义指针的指针来保存指针变量的地址值 问题 为什么需要指向指针的指针 + 指针在本质上也是变量 + 对于指针也同样存在传值调用和传址调用 例子1 :重置动态空间大小 c include include int reset(c 阅读全文
摘要:
main函数的概念 + C语言中main函数称之为主函数 + 一个c程序从main函数开始执行的 下面的main函数定义正确吗? main函数的本质 + main函数是操作系统调用的函数 + 操作系统总是将main函数作为应用程序的开始 + 操作系统将main函数的返回值作为程序的退出状态 例子1: 阅读全文
摘要:
数组指针和指针数组分析 思考 下面这些声明合法吗? 问题: + array代表数组首元素的地址,那么matrix代表什么? + array和&array的地址值相同,但是意义不同,那么它们所代表的类型相同吗 数组类型 + C语言中的数组有自己特定的类型 + 数组的类型由元素类型和数组大小共同决定 例 阅读全文
摘要:
字符串的概念 + 字符串是有序字符的集合 + 字符串是程序中的基本元素之一 + C语言中没有字符串的概念 + C语言中通过特殊的字符数组模拟字符串 + C语言中的字符串是以'\0'结尾的字符数组 字符数组和字符串 在C语言中,双引号引用的单个或者多个字符是一种特殊的字面量 + 存储于程序的全局只读存 阅读全文
摘要:
典型问题一 下面的程序输出什么?为什么? 分析: snprintf()函数本身是可变参数函数,原型如下: 注意:当函数有3个参数时,如果第三个参数没有包含格式化信息,函数调用没有问题;相反,如果第三个参数包含了格式化信息,但缺少后续相应参数,则程序行为不确定。 典型问题二 下面的程序输出什么?为什么 阅读全文
摘要:
问题 数组名可以作为常量指针使用,那么指针是否也可当做数组名来使用呢? 数组的访问方式 + 以下标的形式访问数组中的元素 + 以指针的形式访问数组中的元素 下标形式VS指针形式 + 指针以固定增量在数组中移动时,效率高于下标形式 + 指针增量为1且硬件增量模型时,效率更高 + 下标形式与指针形式的转 阅读全文