您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > C语言中易错点知识点拾遗
1.首先,feof()是文件结束检测函数,如果没有结束,返回值是0,结束了是1由于feof(fp)返回0才是没有结束,所以通常写成while(!feof(fp)),这样使得没有结束时进行循环2.duration=(double)(finish-start)/CLOCKS_PER_SEC;3.const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性4.#includectype.h头文件中判断字符串是否是字母的方法if(!isalpha(c))5.转换大小写字母方法。大写转换小写If(c=’A’&&c=’Z’)c+=32;小写转换大写If(c=’a’&&c=’z’)c-=32;在ctype.h中toupper(charch);Tolower(charch);If(isupper(ch))ch+=32If(islower(ch))ch-=32;Ch=toupper(ch);Ch=tolower(ch);6.命名空间就像一个文件夹,其内的对象名就像一个个文件,不同的文件夹内文件可以重名。在使用重名的文件时,只需要说明是哪个文件夹下的就行了。而你所说的例子里:usingnamespacestd;就是告诉编译器,这行代码之后用到的cout、cin等函数都是std这个命名空间内定义的。7.关于typedef的用法总结不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中。typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我就不加修改的引用过来了,以下是引用的内容(红色部分是我自己写的内容)。用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:char*pa,pb;//这多数不符合我们的意图,它只声明了一个指向字符变量的指针,//和一个字符变量;以下则可行:typedefchar*PCHAR;PCHARpa,pb;这种用法很有用,特别是char*pa,pb的定义,初学者往往认为是定义了两个字符型指针,其实不是,而用typedefchar*PCHAR就不会出现这样的问题,减少了错误的发生。用途二:用在旧的C代码中,帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为:struct结构名对象名,通常讲,typedef要比#define要好,特别是在有指针的场合。请看例子:typedefchar*pStr1;#definepStr2char*;pStr1s1,s2;pStr2s3,s4;在上述的变量定义中,s1、s2、s3都被定义为char*,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。8.野指针的成因主要有三种:一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if(p!=NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块三、指针操作超越了变量的作用范围。这种情况让人防不胜防9.*p=&a是将a的地址传给指针p指向的变量p=&a是将a的地址传给指针p比如p指向x,p=0x00000000,a的地址是0x00000002:第一种情况:p不变,x=0x00000002;第二种情况:p变成0x00000002C语言数组初始化全部为02013-04-1215:03:22分类:C/C++例如:inta[15]={0};第一种,编译器会把第一个初始化值赋给数组的第一个元素,然后用0赋给其余的元素。如果没有给出初始值,编译器不会去做初始化工作。这样简洁的方式让代码更加高效。还有一种,就是memcpy函数的使用。例如上面的数组,可memcpy(a,0,15);不过个人在嵌入式的环境下使用,个人建议用第一种,因为感觉使用函数会大费周章,而且这个函数用得不熟经常用错,调BUG成本也高。最后建议:变量都应该有个初始值。10.定义max与min这样定义~~:intmax(inta,intb){returnab?a:b;}intmin(inta,intb){returnab?a:b;}11.if,elseif和elseif,elseif都需要接判断表达式。else不需要判断表达式。使用elseif和else,必须紧跟在if之后,形参if-esleif组或if-else对。没有对应的if语句,elseif和else语句都会在编译时报错。if(condition1)/*如果满足条件1*/{}elseif(condition2)/*否则,如果满足条件2*/{}else/*否则*/{}12.int*p:p是变量名,类型是int*,说明p存放的是int类型变量的地址。即p的内容表示的是地址&a在指针中指的是变量a的地址,即&a表示的是地址。*p表示以p的内容为地址的变量。system就是调用从程序中调用系统命令(和shell命令)。system(pause)就是从程序里调用“pause”命令;而“pause”这个系统命令的功能很简单,就是在命令行上输出一行类似于“Pressanykeytoexit”的字,等待用户按一个键,然后返回。13.typedef和#define是完全不同的两个东西,最好还是不要混为一谈。typedef用于定义数据类型的别名,是编译期的行为。#define则是预编译时进行的工作,本质是字符串替换的行为。#define在C++中的作用比在C中要小一些,因为C++的内联函数和常量定义可以在很多场合取代#define。用于防止头文件反复包含的条件编译是#define的一个很重要的用途,条件编译也是在预编译时完成的。typedef决不可能由#define来替代,比如在一个比较复杂的类型定义时:typedefint(*PF)();用#define做就不太好看了吧1)定义一个新的结构类型structtagMyStruct{intiNum;longlLength;};分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。我们可以用structtagMyStructvarName来定义变量,但要注意,使用tagMyStructvarName来定义变量是不对的,因为struct和tagMyStruct合在一起才能表示一个结构类型。2)typedef为这个新的结构起了一个名字,叫MyStruct。typedefstructtagMyStructMyStruct;因此,MyStruct实际上相当于structtagMyStruct,我们可以使用MyStructvarName来定义变量。。什么是堆栈?堆栈其实不只是我们平常意义上所谓的具有后进先出特性的数据结构。严格来讲并不存在堆栈这样一种结构,只是在日常工作中我们将前述的这种数据结构称为堆栈罢了,但其实确切的说应该叫做栈(Stack)。而堆(Heap)其实是另一种允许随意访问的数据存储空间。、栈区(stack)—由编译器自动分配释放,存放函数的参数名,局部变量的名等。其操作方式类似于数据结构中的栈。2、堆区(heap)—由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。栈(操作系统):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些堆(数据结构):堆可以被看成是一棵树,如:堆排序栈(数据结构):一种后进先出的数据结构全局变量与全局静态变量的区别:(a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。(b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。(c)具有外部链接的静态;可以在所有源文件里调用;除了本文件,其他文件可以通过extern的方式引用;静态全局变量的作用:(a)不必担心其它源文件使用相同变量名,彼此相互独立。(b)在某源文件中定义的静态全局变量不能被其他源文件使用或修改。(c)只能在本文件中使用!具有内部链接的静态;不允许在其他文件里调用;一个指针变量到底占几个字节(2012-02-0622:43:13)转载▼标签:杂谈分类:计算机首先假设p指向char类型变量(占1个字节)假设q指向int类型变量(占4个字节)假设r指向double类型变量(占8个字节)那么p、q、r它们本身所占的字节数是否一样?这里还得学习一个小知识sizeof(数据类型)此运算符功能:返回值就是该数据类型所占的字节数。sizeof(变量名)此运算符功能:返回值就是该变量所占的字节数。#includestdio.hintmain(void){charch='A';inti=99;doublex=66.6;char*p=&ch;int*q=&i;double*r=&x;printf(%d%d%d\n,sizeof(p),sizeof(q),sizeof(r));//分别输出不同类型的指针变量名占多少字节。return0;}运行结果:总结:任何类型的指针变量都是占用4个字节。指针的范围只和机器字和系统有关比如你的32位系统,指针长度为4,在64位操作系统下那么就都是8了1--结构体数据成员对齐的意义许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数(alignmentmodulus)。这种强制的要求一来简化了处理器与内存之间传输系统的设计,二来可以提升读取数据的速度。比如这么一种处理器,它每次读写内存的时候都从某个8倍数的地址开始,一次读出或写入8个字节的数据,假如软件能保证double类型的数据都从8倍数地址开始,那么读或写一个double类型数据就只需要一次内存操作。否则,我们就可能需要两次内存操作才能完成这个动作,因为数据或许恰好横跨在两个符合对齐要求的8字节内存块上。对齐规则一般来说,结构体的对齐规则是先按数据类型自身进行对齐,然后再按整个结构体进行对齐,对齐值必须是2的幂,比如1,2,4,8,16。如果一个类型按n字节对齐,那么该类型的变量起始地址必须是n的倍数。比如int按四字节对齐,那么int类型的变量起始地址一定是4的倍数,比如0x0012ff60,0x0012ff48等。数据自身的对齐数据自身的对齐值通常就是数据类型所占的空间大小,比如int类型占四个字节,那么它的对齐值就是4整个结构体的对齐整个结构体的对齐值一般是结构体中最大数据类型所占的空间,比如下面这个结构体的对齐值就是8,因为double类型占8个字节。14.一个指针所占用的字节是4,sizeof是被测试类型占用字节的大小strlen是以\0
本文标题:C语言中易错点知识点拾遗
链接地址:https://www.777doc.com/doc-5383376 .html