
C语言笔记
wt0617
这个作者很懒,什么都没留下…
展开
-
多维数组和多维指针
指向指针的指针指针的本质是变量指针会占用一定的内存空间可以定义指针来保存指针变量的地址值二维数组与二级指针二维数组在内存中以一维的方式排布二维数组中的第一维是一位数组二维数组中的第二维才是具体的值二维数组的数组名可看做常量指针原创 2017-11-30 19:54:49 · 222 阅读 · 0 评论 -
函数设计原则
函数从意义上应该是一个独立的功能模块函数名要在一定程度上反映函数的功能函数参数名要能够体现参数的意义尽量避免在函数中使用全局变量当函数参数不应该在函数体内部被修改时,应加上const声明如果参数是指针,且仅作输入参数,则应加上const声明不能省略返回值的类型 -如果函数没有返回值,那么应声明为void类型对参数进行有效性检查 -对于指针参数的检查尤为重要不要返回指向“”栈内存原创 2017-12-04 20:08:55 · 197 阅读 · 0 评论 -
递归函数
递归的数学思想递归是一种数学上分而自治的思想 递归需要有边界条件 -当边界条件不满足时,递归继续进行 -当边界条件满足时,递归停止递归函数函数体内部可以调用自己 递归函数 -函数体中存在自我调用的函数 递归函数是递归的数学思想在程序设计中的应用 -递归函数必须有递归出口 -函数的无限递归将导致程序栈溢出而崩溃原创 2017-12-04 19:36:31 · 271 阅读 · 0 评论 -
函数与宏
宏是由预处理器直接替换展开的,编译器不知道宏的存在 函数是由编译器直接编译的实体,调用行为由编译器决定 多次使用宏会导致最终可执行程序的体积增大 函数是跳转执行的,内存只有一份函数体存在 宏的效率比函数要高,因为是直接展开,无调用开销 函数调用时会创建活动记录,效率不如宏宏的效率比函数稍高,但其副作用巨大 宏是文本替换,参数无法进行类型检查 可以用函数完成的功能绝不用宏 宏的定义中不原创 2017-12-03 21:27:11 · 113 阅读 · 0 评论 -
函数参数
函数参数在本质上与局部变量相同在栈上分配空间 函数参数的初始值是函数调用时的实参值函数参数的求值顺序依赖于编译器的实现程序中的顺序点程序中存在一定的顺序点 顺序点指的是执行过程中修改变量值得最晚时刻 在程序到达顺序点的时候,之前所做的一切操作必须完成C语言中的顺序点每个完整表达式结束时,即分号处 &&,||,?:,以及逗号表达式的每个参数计算之后 函数调用时所有实参求值完成后(进入函数体之原创 2017-12-03 10:20:50 · 282 阅读 · 0 评论 -
函数的意义
面向过程的程序设计面向过程是一种以过程为中心的编程思想首先将复杂的问题分解为一个个容易解决的问题分解过后的问题可以按照步骤一步步完成函数是面向过程在C语言中的体现每个步骤可以用函数来实现声明和定义声明的意义在与告诉编译器程序单元的存在定义则明确指示程序单元的意义C语言中通过extern进行程序单元的声明一些程序单元在声明时可以省略extern原创 2017-12-02 21:04:37 · 898 阅读 · 0 评论 -
内存操作经典问题分析
常见内存错误结构体成员指针未初始化结构体成员指针未分配足够的内存内存分配成功,但并未初始化内存操作越界内存操作规则动态内存申请后,应该立即检查指针值是否为NULL,防止使用NULL指针free指针之后必须立即赋值为NULL任何与内存操作相关的函数都必须带长度信息malloc操作和free操作必须匹配,防止内存泄漏和多次释放原创 2017-12-02 20:24:27 · 154 阅读 · 0 评论 -
内存操作经典问题分析
野指针指针变量中的值是非法的内存地址,进而形成野指针 野指针不是NULL指针,是指向不可用内存的指针 NULL指针并无危害,很好判断,也很好调试 C语言中无法判断一个指针所保存的地址是否合法野指针的由来局部指针变量没有被初始化 指针所指向的变量在指针之前被销毁 使用已经释放过的指针 进行了错误的指针运算 进行了错误的强制类型转换基本原则绝不返回局部变量和局部数组的地址 任何变原创 2017-12-02 19:55:02 · 107 阅读 · 0 评论 -
程序的内存布局
程序与进程程序和进程不同 - 程序是静态的概念,表现形式为一个可执行文件 - 进程是动态的概念,程序有操作系统加载运行后得到的进程 - 每个程序可以对应多个进程 - 每个进程只能对应一个程序各个段的作用堆栈段在程序运行后才正式存在,是程序运行的基础.bss段存放的是未初始化的全局变量和静态变量 //静态存储区.text段存放的是程序中的可执行代码 .data段保存的是已经初始化了的全原创 2017-12-02 19:09:53 · 118 阅读 · 0 评论 -
程序中的栈、堆、静态存储区
程序中的栈栈是现代计算机程序里最为重要的概念之一 栈在程序中用于维护函数调用上下文 函数中的参数和局部变量存储在栈上栈保存了一个函数调用所需的维护信息函数调用过程 每次函数调用都对应着一个栈上的活动记录 调用函数的活动记录位于栈的中部 被调用函数的活动记录位于栈的顶部函数调用时,对应的栈空间在函数返回前是专用的 函数调用结束后,栈空间将被释放,数据不再有效程序中的堆堆是程序中一块预留的内原创 2017-12-02 17:46:08 · 620 阅读 · 0 评论 -
动态内存分配
C语言中的一切操作都是基于内存的 变量和数组都是内存的别名 1. 内存分配由编译器在编译期间决定 2. 定义数组的时候必须指定数组长度 3. 数组长度是在编译期就必须确定的程序运行的过程中,可能需要使用一些额外的内存空间malloc和free用于执行动态内存分配和释放malloc所分配的是一块连续的内存 malloc以字节为单位,并且不带任何的类型信息 free用于将动态内存归还系原创 2017-12-01 21:21:55 · 126 阅读 · 0 评论 -
指针阅读技巧分析
右左法则从最里层的圆括号中未定义的标识符看起首先往右看,再往左看遇到圆括号或方括号时可以确定部分类型,并调转方向重复2,3步骤,知道阅读结束int (*p)(int) 》p为指针,指向函数,指向的函数有一个int参数,返回值为int翻译 2017-11-30 21:40:09 · 233 阅读 · 0 评论 -
函数与指针分析
函数类型C语言中的函数有自己的特定的类型 函数的类型由返回值,参数类型和参数个数共同决定 C语言中通过typedef为函数重命名函数指针函数指针用于指向一个函数 函数名是执行函数体的入口地址 可通过函数类型定义函数指针:FuncType*pointer 也可以直接定义:type(*pointer)(parameter list) 1. pointer为函数指针变量名 2原创 2017-11-30 21:10:45 · 127 阅读 · 0 评论 -
数组参数和指针参数分析
数组参数和指针参数分析C语言种只会以值拷贝的方式传递参数 C语言中的数组参数必然退化为指针多维数组必须提供第一维之外的所有维长度对于多维数组的函数参数只有第一维是可变的原创 2017-11-30 20:26:36 · 136 阅读 · 0 评论 -
main函数的概念
main函数的概念C语言中main函数称之为主函数一个C程序是从main函数开始执行的main(){}void main(){}int main(){}int main()//最标准的方式{ return 0;}main函数是操作系统调用操作系统总是将main函数作为应用程序的开始操作系统将main函数的返回值作为程序的退出状态程序执行时可以向main函数传递参数原创 2017-11-27 21:05:46 · 745 阅读 · 0 评论