
C语言进阶
叶广明_微信ye_guangming
这个作者很懒,什么都没留下…
展开
-
对C语言进行调试的最好方法是什么?
要了解调试程序的最好方法,首先要分析一下调试过程的三个要素:应该用什么工具调试一个程序?用什么办法才能找出程序中的错误?怎样才能从一开始就避免错误?应该用什么工具调试一个程序?有经验的程序员会使用许多工具来帮助调试程序,包括一组调试程序和一些"lint”程序,当然,编译程序本身也是一种调试工具。在检查程序中的逻辑错误时,调试程序是特别有用的,因此许多程序员都把调试程转载 2012-09-15 11:14:38 · 1146 阅读 · 0 评论 -
如何检测C语言中的内存漏洞(leak)?
在动态分配的内存单元(即由函数malloc()或ealloc()分配的内存单元)不再使用却没有被释放的情况下,会出现内存漏洞。未释放内存单元本身并不是一种错误,编译程序不会因此报告出错,程序也不会因此而立即崩溃。但是,如果不再使用而又没有被释放的内存单元越来越多,程序所能使用的内存空间就越来越小。最终,当程序试图要求分配内存时,就会发现已经没有可用的内存空间。这时,尤其是当程序员没有考虑到内存分配转载 2012-09-15 11:15:16 · 1545 阅读 · 0 评论 -
C语言数组参数与指针参数
我们都知道参数分为形参和实参。形参是指声明或定义函数时的参数,而实参是在调用函数时主调函数传递过来的实际值。一、一维数组参数1、能否向函数传递一个数组?看例子:void fun(char a[10]){ char c = a[3];}intmain(){ char b[10] = “abcdefg”; fun(b[10]); return转载 2012-09-15 11:20:15 · 1178 阅读 · 0 评论 -
C语言数组应用
一、数组的内存布局先看下面的例子: int a[5];所有人都明白这里定义了一个数组,其包含了5 个int 型的数据。我们可以用a[0],a[1]等来访问数组里面的每一个元素,那么这些元素的名字就是a[0],a[1]…吗?看下面的示意图:如上图所示,当我们定义一个数组a 时,编译器根据指定的元素个数和元素的类型分配确定大小(元素类型大小*元素个数)的一块内存,并把这块内转载 2012-09-15 11:21:06 · 1479 阅读 · 0 评论 -
C语言指针
一、指针的内存布局先看下面的例子: int *p;大家都知道这里定义了一个指针p。但是p 到底是什么东西呢?还记得第一章里说过,“任何一种数据类型我们都可以把它当一个模子”吗?p,毫无疑问,是某个模子咔出来的。我们也讨论过,任何模子都必须有其特定的大小,这样才能用来“咔咔咔”。那咔出p 的这个模子到底是什么样子呢?它占多大的空间呢?现在用sizeof 测试一下(32 位系统转载 2012-09-15 11:21:47 · 1000 阅读 · 0 评论 -
C语言 常用API
MySQL的C语言API接口1、首先当然是连接数据库,函数原型如下:MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,const char *user,const char *passwd,const char *db,unsigned int port,const char *unix转载 2012-09-16 00:19:25 · 9700 阅读 · 0 评论 -
编译预处理
C语言编译中,什么时候应该使用32位编译程序?32位编译程序应该在32位操作系统上使用。由32位编译程序生成的32位程序比16位程序运行得更快,这正是任何32位的东西都很热门的原因。有那么多不同版本的Microsoft Windows,它们和哪种编译程序组成最佳搭配呢?Windows 3.1和Windows for Workgroups 3.11是16位的操作系统;Microsof转载 2012-09-16 15:24:42 · 974 阅读 · 0 评论 -
C语言函数
函数参数类型必须在函数参数表中或紧跟其后的部分中说明吗?函数参数必须在参数表中说明,除非你使用的是一种过时的编译程序,在这种情况下,你应该通过#ifdef指令来同时实现两种可能的说明方式。定义函数有两种方法。例如,以fool()和foo2()这样两个函数为例,它们都以一个字符指针作为参数,并且返回一个整型值。假设它们是按如下形式定义的: /* old style*/转载 2012-09-16 16:27:29 · 1536 阅读 · 0 评论 -
大型软件编程规范
“安全第一”的C语言编程规范编者按:C语言是开发嵌入式应用的主要工具,然而C语言并非是专门为嵌入式系统设计,相当多的嵌入式系统较一般计算机系统对软件安全性有更苛刻的要求。1998年,MISRA指出,一些在C看来可以接受,却存在安全隐患的地方有127处之多。2004年,MISRA对C的限制增加到141条。 嵌入式系统应用工程师借用计算机专家创建的C语言,使嵌入式系统应用得以飞速发展,而转载 2012-09-16 00:18:52 · 8729 阅读 · 0 评论 -
C语言extern关键词—最会带帽子的关键字
extern,外面的、外来的意思。那它有什么作用呢?举个例子:假设你在大街上看到一个黑皮肤绿眼睛红头发的美女(外星人?)或者帅哥。你的第一反应就是这人不是国产的。extern 就相当于他们的这些区别于中国人的特性。extern 可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,下面的代码用到的这些变量或函数是外来的,不是本文件定义的,提示编译器遇到此变量和函数时在其他模块中寻找转载 2012-09-16 16:29:47 · 1097 阅读 · 1 评论 -
内存管理
常见的C语言内存错误及对策一、指针没有指向一块合法的内存定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存。浅显的例子就不举了,这里举几个比较隐蔽的例子。1、结构体成员指针未初始化struct student{ char *name; int score;}stu,*pstu;intmain(){ strcpy(stu.转载 2012-09-16 16:31:16 · 887 阅读 · 0 评论 -
预处理
C语言##预算符和#运算符一样,##运算符可以用于宏函数的替换部分。这个运算符把两个语言符号组合成单个语言符号。看例子: #define XNAME(n) x ## n如果这样使用宏: XNAME(8)则会被展开成这样: x8看明白了没?##就是个粘合剂,将前后两部分粘合起来。C语言#运算符#也是预处理?是的,你可以这么认为。那怎么用它呢? 别急,先转载 2012-09-16 16:31:40 · 934 阅读 · 0 评论 -
C语言指针数组和数组指针
一、指针数组和数组指针的内存布局初学者总是分不出指针数组与数组指针的区别。其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。下面到底哪个是数组指针,哪个是指针数转载 2012-09-15 11:18:10 · 842 阅读 · 0 评论 -
C语言指针与数组之间的恩恩怨怨
很多初学者弄不清指针和数组到底有什么样的关系。我现在就告诉你:他们之间没有任何关系!只是他们经常穿着相似的衣服来逗你玩罢了。指针就是指针,指针变量在32 位系统下,永远占4 个byte,其值为某一个内存的地址。指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到。数组就是数组,其大小与元素的类型和个数有关。定义数组时必须指定其元素的类型和个数。数组可以存任何类型的数据转载 2012-09-15 11:18:53 · 1151 阅读 · 0 评论 -
C语言指针和数组概述
几乎每次讲课讲到指针和数组时,我总会反复不停的问学生:到底什么是指针?什么是数组?他们之间到底是什么样的关系。从几乎没人能回答明白到几乎都能回答明白,需要经历一段“惨绝人寰”的痛。指针是C/C++的精华,如果未能很好地掌握指针,那C/C++也基本等于没学。可惜,对于刚毕业的计算机系的学生,几乎没有人真正完全掌握了指针和数组、以及内存管理,甚至有的学生告诉我说:他们老师认为指针与数组太难,工转载 2012-09-15 11:22:19 · 943 阅读 · 0 评论 -
C语言typedef关键字—伟大的缝纫师
关于马甲的笑话。有这样一个笑话:一个猎人在河边抓捕一条蛇,蛇逃进了水里。过一会,一个乌龟爬到岸边。猎人一把抓住这个乌龟,大声的说道:小样,别你为你穿了个马甲我就不认识你了!typedef 关键字是个伟大的缝纫师,擅长做马甲,任何东西穿上这个马甲就立马变样。它可以把狼变成一头羊,也能把羊变成一头狼。甚至还可以把长着翅膀的鸟人变成天使,同样也能把美丽的天使变成鸟人。所以,你千万不要得罪它,一定转载 2012-09-15 11:23:02 · 5685 阅读 · 0 评论 -
数组 深入详解
再论C语言数组C语言处理数组的方式是它广受欢迎的原因之一。C语言对数组的处理是非常有效的,其原因有以下三点:第一,除少数翻译器出于谨慎会作一些繁琐的规定外,C语言的数组下标是在一个很低的层次上处理的。但这个优点也有一个反作用,即在程序运行时你无法知道一个数组到底有多大,或者一个数组下标是否有效。ANSI/ISOC标准没有对使用越界下标的行为作出定义,因此,一个越界下标有可能导致这样几种转载 2012-09-16 00:17:47 · 649 阅读 · 0 评论 -
选择结构 案例分析
C语言goto,longjmp()和setjmp()之间有什么区别goto语句实现程序执行中的近程跳转(local jump),longjmp()和setjmp()函数实现程序执行中的远程跳转(nonlocaljump,也叫farjump)。通常你应该避免任何形式的执行中跳转,因为在程序中使用goto语句或longjmp()函数不是一种好的编程习惯。goto语句会跳过程序中的一段代码并转载 2012-09-16 15:23:31 · 868 阅读 · 0 评论 -
运算符的优先级总能起作用吗?
有关运算符优先级的规则稍微有点复杂。在大多数情况下,这些规则确实是你所需要的,然而,有人也指出其中的一些规则本来是可以设计得更好的。让我们快速地回顾一些有关内容:“运算符优先级”是这样一些规则的集合——这些规则规定了“运算符”(例如+,-,等等)的优先性,即哪一种运算符先参加运算。在数学中,表达式“2×3+4×5”和“(2×3)+(4×5)”是等价的,因为乘法运算在加法运算之前进行,也就是转载 2012-09-16 15:23:45 · 1424 阅读 · 0 评论 -
C语言union关键字
union 关键字的用法与struct 的用法非常类似。union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。例子如下:union StateMachine{ char character; int number;转载 2012-09-16 16:29:57 · 718 阅读 · 0 评论 -
C语言void关键字
void 有什么好讲的呢?如果你认为没有,那就没有;但如果你认为有,那就真的有。有点像“色即是空,空即是色”。一、void a?void 的字面意思是“空类型”,void *则为“空类型指针”,void *可以指向任何类型的数据。void 几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void 变量,看看下面的例子: void a;Visual C++6.0转载 2012-09-16 16:30:47 · 897 阅读 · 0 评论 -
C语言关键字
C语言do、while、for关键字—循环C 语言中循环语句有三种:while 循环、do-while 循环、for 循环。while 循环:先判断while 后面括号里的值,如果为真则执行其后面的代码;否则不执行。while(1)表示死循环。死循环有没有用呢?看下面例子:比如你开发一个系统要日夜不停的运行,但是只有操作员输入某个特定的字符‘#’才可以停下来。while(1转载 2012-09-16 16:31:01 · 2022 阅读 · 0 评论 -
什么是换码符(escape character)?
换码符是用来执行一个命令或一项任务的字符,它们不会被打印到屏幕上。例如,一个换码符可以是这样一个字符,它被传递给一个设备,告诉计算机屏幕以红色而不是通常的白色来显示下一行。这个换码符将和真正要被设备以红色来显示的字符一起被传递给设备。那么设备如何知道这个字符是一个换码符呢?一般来说,在发送换码符之前,要先发送Escape键(十进制为27,八进制为\033),这样设备就会知道下一个到达的字符是换码符转载 2012-09-15 11:16:07 · 1324 阅读 · 0 评论 -
C语言多维数组与多级指针
多维数组与多级指针也是初学者感觉迷糊的一个地方。超过二维的数组和超过二级的指针其实并不多用。如果能弄明白二维数组与二级指针,那二维以上的也不是什么问题了。所以本节重点讨论二维数组与二级指针。一、二维数组1、假想中的二维数组布局我们前面讨论过,数组里面可以存任何数据,除了函数。下面就详细讨论讨论数组里面存数组的情况。Excel 表,我相信大家都见过。我们平时就可以把二维数组假想成一个ex转载 2012-09-15 11:17:24 · 959 阅读 · 0 评论 -
C语言函数指针
一、函数指针的定义顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。看例子:A)char * (*fun1)(char * p1,char * p2);B)char * *fun2(char * p1,char * p2);C)char * fun3(char * p1,char * p2);看看上面三个表达式分别是什么意思?C):这很容易,fu转载 2012-09-15 11:19:42 · 866 阅读 · 0 评论 -
C语言enum关键字
很多初学者对枚举(enum)感到迷惑,或者认为没什么用,其实枚举(enum)是个很有用的数据类型。一、枚举类型的使用方法一般的定义方式如下:enum enum_type_name{ ENUM_CONST_1, ENUM_CONST_2, ... ENUM_CONST_n} enum_variable_name;注意:enum_type_n转载 2012-09-15 11:23:38 · 1064 阅读 · 0 评论 -
VC6.0详细教程
1 编制并运行一个简单程序1.1 编制并运行程序的“四步曲”1.2 工程(PROJECT)以及工程工作区(PROJECT WORKSPACE)1.3 启动并进入VC6的集成开发环境1.4 创建工程并输入源程序代码(1)新建一Win32 Console Application工程(2)在工作区窗口中查看工程的逻辑架构(3)在工程中新建C源程序文件并输入源程序代码1.转载 2012-09-16 00:18:35 · 4724 阅读 · 0 评论 -
排序与查找 详细分析
C语言五种基本排序算法程序员可以使用的基本排序算法有5种:插入排序(insertionsort.)交换排序(exchangesOrt)选择排序(selectionsort)归并排序(mergesort)分布排序(distributionsort)为了形象地解释每种排序算法是怎样工作的,让我们来看一看怎样用这些方法对桌上一付乱序的牌进行排序。牌既要按花色排序(依次为梅花、方块、红转载 2012-09-16 00:19:47 · 834 阅读 · 0 评论 -
软件行业资讯
为什么只有设计师才能发明流行的新语言先回顾一下知名编程语言的作者和创造时间:Fortran 语言,50年代,IBM 研究员;Lisp 语言,50年代,MIT 的教授和学生;C语言,70年代,贝尔实验室的两位研究员;PHP,1994年,作者 Rasmus Lerdorf ,名字代表“Personal Home Page Tools”;JavaScript,1995年,作者 B转载 2012-09-16 16:28:47 · 2238 阅读 · 0 评论 -
指针深入探讨
C语言变量的内存实质一、先来理解C语言中变量的实质要理解C指针,我认为一定要理解C中“变量”的存储实质,所以我就从“变量”这个东西开始讲起吧!先来理解理解内存空间吧!请看下图:如上图所示,内存只不过是一个存放数据的空间,就好像我的看电影时的电影院中的座位一样。电影院中的每个座位都要编号,而我们的内存要存放各种各样的数据,当然我们要知道我们的这些数据存放在什么位置吧!所以内存也要象座转载 2012-09-16 00:18:07 · 796 阅读 · 0 评论 -
数据和文件操作
怎样用C语言对某个目录下的文件名进行排序?在4.8的例子中,用_dos_findfirst()和_dos_findnext()函数遍历目录结构,每找到一个文件名,就把它打印在屏幕上,因此,文件名是逐个被找到并列出来的。当你对某个目录下的文件名进行排序时,这种逐个处理的方式是行不通的。你必须先将文件名存储起来,当所有的文件名都找到后,再对它们进行排序。为了完成这项任务,你可以建立一个指向转载 2012-09-16 00:20:18 · 717 阅读 · 0 评论 -
循环结构 案例分析
怎样才能知道循环是否提前结束了循环通常依赖于一个或多个变量,你可以在循环外检查这些变量,以确保循环被正确执行。请看下例:int xchar * cp[REQUESTED_BLOCKS]/ * Attempt (in vain, I must add... )to allocate 512 10KB blocks in memory. * /for (x = 0转载 2012-09-16 15:23:09 · 727 阅读 · 0 评论 -
很好的推荐书籍
五百本编程书籍推荐【信息化类】书号书名作者出版时间定价对应页码TP02041企业资源计划(ERP)教程罗鸿2006-1¥28.00—TP02031ERP理论、方法与实践周玉清 等2005-12¥39.00—TP01059ERP原理·设计·实施(第3版)罗鸿2005-4¥3转载 2012-09-16 15:24:15 · 4347 阅读 · 0 评论 -
C语言变量
C语言二进制、八进制、十六进制详解什么是二制制?在数学计算中,二进制计数系统的公分母是最小的,它以2为基数。你还记得在小学或中学时所学的不同的计数系统吗?笔者在上小学时,曾在一堂数学课中学过以6为基数的计数系统;你先数1,2,3,4,5,然后是10,11,12,13,14,15,然后是20,等等,实际上,应该先数0,1,2,3,4,5,然后是10,1l,12,13,14,15,等等。从O开转载 2012-09-16 16:28:30 · 1979 阅读 · 0 评论 -
C语言goto关键字—尽量少用
一般来说,编码的水平与goto 语句使用的次数成反比。有的人主张慎用但不禁用goto语句,但我主张禁用。关于goto 语句的更多讨论可以参看Steve McConnell 的名著《CodeComplete. Second Edition》。禁用goto 语句。自从提倡结构化设计以来,goto 就成了有争议的语句。首先,由于goto 语句可以灵活跳转,如果不加限制,它的确会破坏结构化设计风格转载 2012-09-16 16:29:04 · 1058 阅读 · 0 评论 -
C语言const关键字—也许该被替换为readolny
const 是constant 的缩写,是恒定不变的意思,也翻译为常量、常数等。很不幸,正是因为这一点,很多人都认为被const 修饰的值是常量。这是不精确的,精确的说应该是只读的变量,其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容。或许当初这个关键字应该被替换为readonly。那么这个关键字有什么用处和意义呢?const 推出的初始目的,正是为了取代预编译指令,消除它的缺转载 2012-09-16 16:29:36 · 818 阅读 · 0 评论 -
C语言struct关键字详解—结构体
struct 是个神奇的关键字,它将一些相关联的数据打包成一个整体,方便使用。在网络协议、通信控制、嵌入式系统、驱动开发等地方,我们经常要传送的不是简单的字节流(char 型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。经验不足的开发人员往往将所有需要传送的内容依顺序保存在char 型数组中,通过指针偏移的方法传送网络报文等信息。这样做编程复杂,易出错,而且一旦控转载 2012-09-16 16:30:28 · 1018 阅读 · 0 评论 -
C语言return关键字
return 用来终止一个函数并返回其后面跟着的值。return (Val);//此括号可以省略。但一般不省略,尤其在返回一个表达式的值时。return 可以返回些什么东西呢?看下面例子:char * Func(void){ char str[30]; … return str;}str 属于局部变量,位于栈内存中,在Func 结束的时候被释放,所以转载 2012-09-16 16:31:52 · 1189 阅读 · 0 评论 -
爱恨交织的编程语言 是什么吸引了你
摘要:每门编程语言都有自身独特的地方,那么为什么有些语言会一直存活在我们周围,而有些语言却逐渐被人淡忘,是什么吸引你?每名程序员至少知道两门以上的编程语言,有些甚至不是所谓的编程语言(比如Shell脚本),有些语言已被人们渐渐淡忘,而有些自从诞生就一直与我们形影不离,很难被超越和代替(如JavaScript)、而有些语言只是玩乐而已。是什么决定了编程彼此间的不同?语法吗?语法无非像是个转载 2012-09-19 13:38:19 · 829 阅读 · 0 评论 -
C/C++函数名修饰约定
函数名字修饰(Decorated Name)方式 函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型。正在装载数据…… LINK程序或其他工具有时需要指定函数的名字修饰来定位函数的正确位置。多数情况下程序员并不需要知道函数的名字修饰,LINK程序或其他工具会自动区分他们。当然,在某转载 2012-09-20 00:19:59 · 1312 阅读 · 0 评论