C语言深度剖析-----函数】的更多相关文章

认清函数的真面目 函数的意义 面向过程的程序设计 函数声明和定义 函数参数 编写代码的时候,不要编写类似先后调用的代码 f(k,k++) C语言中的顺序点 a--&&a  ,&&为顺序点,所以a--&&a为0 f(k,k++)的顺序点为进入函数体之前 函数的缺省认定 小结 可变参数列表 如何编写一个可以计算n个数平均值的函数? 用数组 用可变参数列表 可变参数 可变参数的限制 小结 李逵和李鬼(函数和宏) 宏的优点和缺点 函数的优缺点 宏无可替代的优点 小结…
阅读代码的重要技巧 函数类型 函数指针 回调函数 使用示例 指针阅读技巧解析 例…
                      指针的本质 指针需要保证指向任意数据类型,所以指针变量都占用32位bit即4字节. PS:不同机器上,指针占用内存不一                        传值调用与传址调用                传值调用   需用8000字节内存               传址调用 只需用4字节内存 所以复杂数据类型用指针调用     swap 传值调换,只是内部参数a.b调换 传址调换,外部i.j调换 SWAP宏直接替换(好处)        …
读书笔记之:C语言深度剖析 <C 语言深度解剖>这本书是一本“解开程序员面试笔试的秘密”的好书.作者陈正冲老师提出“以含金量勇敢挑战国内外同类书籍”,确实,这本书中的知识点都是一些在面试中常见的考点,并且很多都是我们平常不注意的点,对于我们深入理解C语言确实很有帮助. 第1章关键字 1.register虽然寄存器的速度非常快,但是使用register修饰符也有些限制的:register变量必须是能被CPU寄存器所接受的类型.意味着register变量必须是一个单个的值,并且其长度应小于或等于整…
原书很多已经写的很清楚很精炼了,我也无谓做无意义的搬运,仅把一些基础和一些我自己以前容易搞混的地方写一下. 1. 意义: 指针: 指针也是一种类型,长度为4字节,其存放的内容只能是一个地址(4字节). 比如 char* ptr; ptr指向一个地址,而这个地址理想的情况下存放着一个char型数据,特殊情况下也可能会指向NULL,甚至变成野指针. 数组: 数组代表的是一段连续的内存地址,而并非指针那样代表的只是一个地址. 一般数组会有名字,比如 ] ; 即把一段长度为100个sizeof(char…
本节主要讲C语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空格. 1.在程序中使用注释符号有以下几点需要注意 (1)如果注释符号在数据类型和变量之间,那么将不会影响程序的正常运行. int/*...*/i; (2)如果注释符号位于数据类型之间,那么程序将不会正常运行,因为一个数据类型关键字中间出现一个空格,那么数据类型关键字也就不再是关键字了. /*不能正常…
关键字: C语言关键字32个: 关键字                                         意 义 auto                           声明自动变量,缺省时编译器一般默认为 auto int                               声明整型变量 double                       声明双精度变量 long                            声明长整型变量 char         …
动态内存分配 为什么使用动态内存分配 例:记录卖出的商品 卖出商品最多只能记录1000个 两种改进的方法 都需要动态内存分配 第二种方法需要重置内存 calloc和realloc realloc重置内存空间 例 小结 malloc(0)申请内存 首先:      在标准的malloc实现中,并不检查输入值的大小,而是将输入值做对齐操作后直接从堆上分配空间.  其次:      不论输入值的大小为多少,在malloc的内部最小的内存分配大小是一个定值(一般是8B),因为malloc需要用这部分空间…
0. static修饰变量和函数 static修饰变量,1)限定作用域,本文件内.全局变量(自定义起,本文件前面要用需extern声明),局部变量函数内:2)生命周期,程序运行期间一直保存. static修饰函数,限定作用域,本文件内.1. enum类型变量大小为4(sizeof),不论enum成员数量.2. enum成员间用","分割,最后一个成员后可不加分隔号. 而struct.union成员间用":"分割,最后一个成员后要加分隔号.而struct的成员初始化用…
1.数值宏常量     #define宏定义是个演技非常高超的替身演员,但也会耍大牌的,所以我们使用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码都认识宏了:也可以把任何东西都定义成宏.因为编译器会在预编译的时候用真身替换替身,所以在我们的代码里可以常常用替身来帮忙.     #define  PI     3.1415926    在此后的代码中,你尽可能的使用PI来代替3.1415926,而且最好就这么做.不然的话,如果我们精度再提高一点怎么办?如果用PI的话,我们就…
const是constant的缩写,是恒定不变的意思.被const修饰的值,是只读变量. 1.const修饰只读变量,具有不变性      #include <stdio.h> int main()    {      const int Max = 100;      int Array[Max];              return 1;    }     在VC6.0中创建该文件,编译器会报错.因为我们定义数组必须指定其元素的个数,这也从侧面证实C语言中,const修饰的Max仍然是…
指针数组和数组指针的分析 数组类型 定义数组类型 数组指针 这个不可能为数组指针,指向数组首元素 例 指针数组 例    main函数的参数 例 小结…
数组退化的意义 当向函数传递数组时, 二维数组参数 等价关系 注意事项 只能去一维数组 无法向一个函数传递一个任意的多维数组,注释地方出错 传递与访问二维数组的方式 动态地算出二维数组的列…
S1字符数组 S2字符串,存在于栈空间 S3最常规的写字符串的方法,malloc是堆空间,存在于只读存储区,我们不能够改变指向S3的数据 S4堆空间  S4 字符串的长度 判断字符串长度,assert 判断是否空 length strlen字符串长度   size sizeof数组大小 无符号数相减总是大于0,第二个if不成立 使用一条语句实现strlen(面试题,考递归.三目运算符.逗号表达式) 最终答案: 注意 不受限制的字符串函数,自己判断 \0 相等返回0 strcpy的实现,面试出现概…
volatile关键字和const一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统,硬件或者其他线程等等.遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问.   下面例子: int  i = 10: int  j = i;   // 语句1 int  k = i;   // 语句 2 此时,编译器对代码进行优化,这是因为,在1,2两句中,i没有被用作左值(没有被赋值).这时候编译器认为i的值没有改变,所以在语句…
多维数组和多维指针 指向指针的指针 指针变量同样也有传址调用和传值调用 case1:估算要5个字节的空间,实际只用前面3个字节,设计释放空的2字节 case2:扩充到10字节 二维数组与二维指针 二维数组里首元素为数组,a的类型为数组指针 例子 以一维的方式遍历二维数组 面试题 以指针的方式遍历二维数组 如何动态申请二维数组 小结…
数组的本质: 指针的运算: 小标VS指针: a和&a的区别: 例: 数组参数: 所以下例返回4 指针和数组的对比小结:…
数组的概念 数组的大小 实例 内存占用 长度 a[5] 不指定初始值的话,随机给数值 数组地址与数组名 a为数组首地址,&a为数组地址,值相等,意义不同 数组名不可以直接相等 例:主义区分指针和数组 (数组会直接打印字符串的地址) 编译器处理指针和数组不同,处理指针会先到内存找到字符串地址,然后根据地址找字符串. 处理数组会直接到内存找字符串,但不会报错. 改正: 数组小结…
进军C++ 初始OOP   抽象 封装 封装的好处,改名只需改封装 小结 面试题 指针运算 打印11,16,29,28,26 调试经验 printf定义,可变参数无法判断实际参数的类型 安全编程 数组越界改写flag 最好用strncpy,最多复制n字节…
#include <stdio.h> int  main(void) {    int  a[5] = {1, 2, 3, 4, 5}; int* ptr1 = (int*)(&a + 1); int* ptr2 = (int*)((int)a + 1); printf("%x, %x\n", ptr1[-1], *ptr2); } 这个题目主要是考了两个知识点一个是指针的知识,第二个是大端机和小端机的知识 首先需要明确x86是小端机,所以它的数值在各个字节中的顺序…
对于本节的函数内容其实就没什么难点了,但是对于函数这节又涉及到了顺序点的问题,我觉得可以还是忽略吧. 本节知识点: 1.函数中的顺序点:f(k,k++);  这样的问题大多跟编译器有关,不要去刻意追求.  这里给下顺序点的定义:顺序点是执行过程中修改变量值的最后时刻.在程序到达顺序点的时候,之前所做的一切操作都必须反应到后续的访问中. 2.函数参数:函数的参数是存储在这个函数的栈上面的(对于栈可以看上篇文章<内存管理的艺术>),是实参的拷贝. 3.函数的可变参数: a.对于可变参数要包含sta…
目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objective-C类不能动态添加成员变量 总结 看下面的代码,考虑Objective-C里最常见的操作之一——类成员变量访问. - (void)doSomething:(SomeClass *)obj { obj->ivar1 = 42; // 访问obj对象的public成员变量 int n = sel…
js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕. 平时发的文章基本都是开发中遇到的问题和对最佳解决方案的探讨,终于忍不住要写一篇基础概念类的文章了. 本文探讨以下问题,在座的朋友各取所需,欢迎批评指正: 创建对象 __proto__与prototype 继承与原型链 对象的深度克隆 一些Object的方法与需要注意的点 ES6新增特性 下面反复…
本文转载自博文C/C++ Volatile关键词深度剖析. 背景 前几天,发了一条如下的微博 (关于C/C++ Volatile关键词的使用建议): 此微博,引发了朋友们的大量讨论:赞同者有之:批评者有之:当然,更多的朋友,是希望我能更详细的解读C/C++ Volatile关键词,来佐证我的微博观点.而这,正是我写这篇博文的初衷:本文,将详细分析C/C++ Volatile关键词的功能 (有多种功能).Volatile关键词在多线程编程中存在的问题.Volatile关键词与编译器/CPU的关系.…
c++ 单元测试框架 gmock 深度剖析 随着微服务和CI的流行,在目前的软件工程领域中单元测试可以说是必不可少的一个环节,在TDD中,单元测试更是被提高到了一个新的高度.但是很多公司由于很多不同的原因,没有能持续维护,或者干脆就从来没有写过单元测试,确实,单元测试在初期和代码维护期会需要花一些投入,但是,如果一个项目是需要长期维护和更新的,那么单元测试的作用,相对于投入来说就根本不算什么.见过很多人写的单元测试,虽然也可以运行,也有覆盖率,但是稍微分析一下就会看出来,那根本就不是单元测试,而…
libevent源码深度剖析十 ——支持I/O多路复用技术 张亮 Libevent的核心是事件驱动.同步非阻塞,为了达到这一目标,必须采用系统提供的I/O多路复用技术,而这些在Windows.Linux. Unix等不同平台上却各有不同,如何能提供优雅而统一的支持方式,是首要关键的问题,这其实不难,本节就来分析一下. 1 统一的关键 Libevent支持多种I/O多路复用技术的关键就在于结构体eventop,这个结构体前面也曾提到过,它的成员是一系列的函数指针, 定义在event-interna…
libevent源码深度剖析一 ——序幕 张亮 1 前言 Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不少.写这一系列文章的用意在于,一则分享心得:二则对libevent代码和设计思想做系统的.更深层次的分析,写出来,也可供后来者参考. 附带一句:Libevent是用c语言编写的(MS大牛们都偏爱c语言哪),而且几乎是无处不函数指针,学习其源代码也需要相当的c语言基础. 2 Libevent简介 上来当然要先夸奖啦,Libevent 有几个显著的亮点: 事件…
ASP.NET MVC深入浅出系列(持续更新)   一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模式,ViewState功不可没,通过的控件的拖拽和绑定,很快就可以搭建出来一个Web项目,其开发速度远胜Java.PHP,当年Web项目并不很重视体验,没有今天响应式,没有各种前端js框架,所以在当年的WebForm,微软是以引以为豪的. 该框架毕竟有时代局限性,随着前端的崛起,随着人们对项目体验的…
目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objective-C类不能动态添加成员变量 总结 版权声明: 看下面的代码,考虑Objective-C里最常见的操作之一——类成员变量访问.   可能大多数人都没有意识到的是: Objective-C的 -> 操作符不是C语言指针操作! Objective-C对象不能简单对应于一个C struct,访问成员…
由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持shuang_lang_shuo[破狼]微信号,同时也欢迎大家的高质量文章的投稿. 在2015年一年时间中,我.雪狼大叔.彭洪伟一起共同编写了<AngularJS深度剖析与最佳实践>这本前端Angular.js框架的进阶书籍.在写作期间也得到很多人的支持,特别是在Angularjs中文社区群中的各位群…