
C语言
laihw
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
链表
10.7 用指针处理链表 10.7.1链标概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.我们知道,用数组存放数据时, 必须事先定义固定的长度(即元素个数).比如,有的班级有100人,而有的班只有30人,如果要用同一个数组先后存放不同班级的学生数据,则必须定义长度为100的数组.如果事先难以确定一个班的最多人数,则必须把数组定得足够大,以能存放任何班级的学生数据.显然这将会原创 2008-10-20 10:08:00 · 349 阅读 · 0 评论 -
指向指针的指针
先看一个例子: #include ; char buf[10] = "hello"; void pro(char *out) { out = buf; } main() { char *p = NULL; pro(p); printf("%转载 2008-11-08 17:26:00 · 216 阅读 · 0 评论 -
推荐的加强C语言学习的书籍
自认为C(嵌入式方面)的功底比较扎实,这里推荐几本我认为非常好的书给大家,首推的就是林锐博士的《高质量C编程指南》,这真的是一本非常不错的书,精短。呵呵,我们公司招聘的笔试题目都是从这本书上抄下来的。我也相信你看懂了总共才这本百来页的书的C的部分(还有一些C++)的,你就能找到一份不错的C语言的工作了。对了,顺便提一句,现在的大学生就像我当时读书一样,认为C太“低级”了,学了一点C的语法就到处问下转载 2008-11-08 16:51:00 · 492 阅读 · 0 评论 -
内存对齐
对于大部分程序员来说,“内存对齐”对他们来说都应该是“透明的”。“内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了。 一、内存对齐的原因大部分的参考资料都是如是说的:1、平台原因(移植原因):不是所有的硬件平台都能访问任意地转载 2008-11-09 14:30:00 · 206 阅读 · 0 评论 -
函数调用的底层机制
这是一篇介绍c语言中的函数调用是如何用实现的文章。写给那些对c语言各种行为的底层实现感兴趣人的入门级文章。如果你是c语言或者汇编、底层技术的老鸟或是对这个问题不感兴趣,那么这篇文章只会耽误您的时间,您大可不必阅读他。当然如果前辈们愿意为我指出不足,我将十分感谢您的指导,并对耽误您宝贵的时间致歉。好了,废话少说!要研究这个问题,让我们先打开vc++吧。最好是6.0的,:-p。(什么你没有vc++,倒转载 2008-11-09 15:34:00 · 436 阅读 · 0 评论 -
链式存储方式和顺序存储方式的比较
链式表的特点和优点就是插入和删除方便,但是要遍历也就是浏览就比较费时了.他是根据每个元素存储的下一位的地址来访问的.比如要访问第九个就必须从第一个开始,第一的问第二,第二问第三.比较费时 顺序表特点和优点就是遍历方便.他遍历的时候只要输入你要查找的位置,他可以自己计算内存大小,直接访问,比如我一个对象数组,每个对象的大小是10字节.然后我要访问第三个.他就可以直接10*3,然后去访问那块内存再原创 2008-11-12 18:56:00 · 4323 阅读 · 1 评论 -
ADT 抽象数据类型
从数据结构的角度来说顺序结构的存储空间固定,可扩展性差,但是如果数据元素个数已知,较链式存储节省空间。他的优点是随机读取任意一个元素(因为元素时顺序存储的,所以元素的存储位置之间有一定的关系)但是顺序存储的缺点是删除,插入操作需要花费很多时间在移动元素上。 对于链式存储而言,插入和删除元素开销小,操作简便。可扩展性强。 综上所述,如果元素个数已知,且插入删除较少的可以使用顺序结构,而对于频转载 2008-11-12 19:27:00 · 267 阅读 · 0 评论 -
编译程序的分类
编译程序的工作情况有三种:汇编型、解释型和编译型。汇编型编译程序用来将汇编语言编写的程序,按照一一对应的关系,转换成用机器语言表示的程序。解释型编译程序将高级语言程序的一个语句,先解释成为一组机器语言的指令,然后立即执行,执行完了,取下一组语句解释和执行,如此继续到完成一个程序为止。用解释型编译程序,执行速度很慢,但可以进行人和计算机的"对话",随时可以修改高级语言的程序。BASIC语言就转载 2008-11-12 19:33:00 · 406 阅读 · 0 评论 -
C语言中的内存管理
相比静态地分配内存空间,使用动态内存分配具有明显的优势:1, 分配空间的大小够精确: 设想一个读取用户输入行的程序, 如果使用静态分配的数组作为buffer, 那么, 你如何确定该数组的长度呢? 太大或太小都不合适. 因为你无法事先知道用户输入字符串的长度. 而使用动态内存分配就精准多了.2, 静态分配的空间大小无法更改, 而动态分配的内存大小是可调的.所以, 理解C语言中的动态内存分转载 2008-11-13 19:26:00 · 443 阅读 · 0 评论 -
POSIX
操作系统标准 术语解释:POSIX是Portable Operating System Interface of Unix的缩写。由IEEE(Institute of Electrical and Electronic Engineering)开发,由ANSI和ISO标准化。 由来:POSIX的诞生和Unix的发展是密不可分的,Unix于70年代诞生于Bell lab,并于原创 2008-11-13 19:14:00 · 223 阅读 · 0 评论 -
MISRA C Coding Standard
MISRA (The Motor Industry Software Reliability Association 汽车工业软件可靠性联会) 是位于英国的一个跨国汽车工业协会,其成员包括了大部分欧美汽车生产商。其核心使命是为汽车工业提供服务和协助,帮助厂方开发安全的、高可靠性的嵌入式软件。这个组织最出名的成果是所谓的MISRA C Coding Standard,这一标准中包括了127条C语言编原创 2008-11-22 13:36:00 · 547 阅读 · 0 评论 -
C语言嵌入式系统编程修炼之二:软件架构篇
模块划分 模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求。C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了>相对论),C语言模块化程序设计需理解如下概念: (1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明; (2)转载 2008-11-10 11:21:00 · 191 阅读 · 0 评论 -
函数调用约定
在C语言中,假设我们有这样的一个函数:int function(int a,int b)调用时只要用result = function(1,2)这样的方式就可以使用这个函数。但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。也就是说,计算机不知道怎么给这个函数传递参转载 2008-11-09 15:33:00 · 219 阅读 · 0 评论 -
NULL和NUL
C程序员应该明白, 在指针上下文中 NULL 和 0 是完全等价的, 而未加修饰的 0 也完全可以接受。任何使用 NULL (跟 0 相对) 的地方都应该看作一种温和的提示, 是在使用指針; 程序员 (和编译器都) 不能依靠它来区别 指針 0 和整数 0。非指針的上下文中 不要用NULL来代替0 ( ANSI允许把NULL定义为 ((void *)0 )转载 2008-11-08 22:51:00 · 285 阅读 · 0 评论 -
网上流传的华为的笔试题
1) 什么是预编译,何时需要预编译: 总是使用不经常改动的大型代码体。 程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。2) char * const p; char const * p const char *p 上述三个有什么区别? char * const p; //常量指针,p原创 2008-10-22 23:02:00 · 274 阅读 · 0 评论 -
突然发现C里面没有幂运算符
为什么 C 不提供乘幂的运算符?因为提供乘幂指令的处理器非常少。 C 有一个 pow() 标准函数, 原型说明在 。而对于小的正整数指数, 直接用乘法一般会更有效。原创 2008-10-25 16:24:00 · 486 阅读 · 0 评论 -
例程(routines)
例程的作用类似于函数,但含义更为丰富一些。例程是某个系统对外提供的功能接口或服务的集合。比如操作系统的API、服务等就是例程;Delphi或C++Builder提供的标准函数和库函数等也是例程。我们编写一个DLL的时候,里面的输出函数就是这个DLL的例程。 可以这么简单地来理解:把一段相对独立的代码写成单独的一个模块就是函数的概念。我们可以在自己的程序中编写很多个函数,从而实现模块化编程。但原创 2008-11-07 18:02:00 · 277 阅读 · 0 评论 -
C基础知识:函数指针和指针函数的基本概念
在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。1.函数指针定义函数类型 (*指针变量名)(形参列表);“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函原创 2008-11-07 18:16:00 · 689 阅读 · 0 评论 -
内存泄露
在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏与许多其他问题有着相似的症状,并且通常情况下只能由那些可以获得程序源代码的程序员才可以分析出来。然而,有不少人习惯于把任何不需要的内存使用的增加描述为内存泄漏,即使严格意义上来说这是不准确原创 2008-11-07 18:17:00 · 257 阅读 · 0 评论 -
指针数组和数组指针的区别
对于复杂类型的描述(这个还不太算很复杂),首先你一定要知道构造符号的三对(个)运算符:* [] () []和()的结合性很强,而*的结合力较弱; []和()采用从左到右的结合方式,而*是从右向左。 你的例子中: int *a[N];/*首先a是一个数组,因为a的后面紧跟了一个[],它的优先级是很高的(比*高),其次它的转载 2008-11-07 21:29:00 · 202 阅读 · 0 评论 -
volatile两篇
volatile修饰的变量表示它的值会可能被意想不到的改变了 比如输入口,或者是一些反映什么状态的寄存器,即使不操作,它的值也有 可能被改变了。 加上volatile修饰之后,编译器就不会假设它的值了,而是每次都重新读取。 volatile 影响编译器编译的结果,指出,volatil原创 2008-11-07 23:16:00 · 226 阅读 · 0 评论 -
指针的大小
指针的大小是问:一个指针变量占用多少内存空间? 分析:既然指针只是要存储另一个变量的地址,。注意,是存放一变量的地址,而不是存放一个变量本身,所以,不管指针指向什么类型的变量,它的大小总是固定的:只要能放得下一个地址就行!(这是一间只有烟盒大小的“房间”,因为它只需要入一张与着地址的纸条)。 存放一个地址需要几个字节?答案是和一个 int 类型的大小相同:4字节。 所以转载 2008-11-08 22:42:00 · 403 阅读 · 0 评论 -
C语言嵌入式系统编程修炼之三:内存操作
数据指针 在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力。在嵌入式系统的实际调试中,多借助C语言指针所具有的对绝对地址单元内容的读写能力。以指针直接操作内存多发生在如下几种情况: (1) 某I/O芯片被定位在CPU的存储空间而非I/O空间,而且寄存器对应于某特定地址; (2)转载 2008-11-10 11:22:00 · 212 阅读 · 0 评论 -
C语言嵌入式系统编程修炼之六:性能优化
使用宏定义 在C语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个: 错误做法:#define MIN(A,B) ( A <= B ? A : B ) 正确做法:#define MIN(A,B) ((A)<= (B)转载 2008-11-10 11:24:00 · 336 阅读 · 0 评论 -
#include
被包含的文件用尖括号括起来是直接到系统指定的路径找;- z3 z, [5 @5 R; ] Z被包含的文件用双引号括起来是除了到系统指定的路径找之外,还会在源文件所在的文件夹找;建议用双引号括起文件名好了。原创 2008-12-09 14:34:00 · 277 阅读 · 0 评论