随笔分类 - C/C++
摘要:用变量a给出下面的定义 a)一个整型数 b)一个指向整型数的指针(Apointertoaninteger) c)一个指向指针的的指针,它指向的指针是指向一个整型数(Apointertoapointertoanintege) d)一个有10个整型数的数组(Anarrayof10integers) e)一个有10个指针的数组,该指针是指向一个整型数的。(Anarrayof10pointerstointegers) f)一个指向有10个整型数数组的指针(Apointertoanarrayof10integers) g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(Apointertoaf
阅读全文
摘要:1,exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程,而return是返回函数值并退出函数2,return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。3,exit函数是退出应用程序,并将应用程序的一个状态返回给OS,这个
阅读全文
摘要:好久没写博客了 ,一是懒,二是没什么可写,或者说最近真正看书的时间不多,时间也是花了的,都搞飞思卡尔了,不过调车这个东西,很耗时间的,但也确实有趣。 今天在同学那看到了KR的《The C Programming Language》,说来惭愧,一时说自己是搞软件的,但却没有看完这本最最经典的著作。 直接翻到第7章输入与输出,做第一个练习题7-1,题目是编写一个程序,根据它自身被调用时存放在argv[0]中的名字,实现将大写字母转换为小写字母或将小写字母转换为大写字母的功能。程序很easy,实现如下(平台ubuntu)#include <stdio.h> #include <st
阅读全文
摘要:#与##在宏定义中的--宏展开#include <stdio.h>#define f(a,b) a##b#define g(a) #a#define h(a) g(a)int main(){ printf("%s/n", h(f(1,2))); // 12 printf("%s/n", g(f(1,2))); // f(1,2) return 0;}宏展开时:如果宏定义以#开头,不展开参数,直接替换。故g(f(1,2))--->#f(1,2)--->"f(1,2)";如果宏定义不以#开头,展开参数,直接替换,由
阅读全文
摘要:原 型: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
功 能: 使用快速排序例程进行排序
参 数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序
阅读全文
摘要:C90及C++的数组对象定义是静态联编的,在编译期就必须给定对象的完整信息。但在程序设计过程中,我们常常遇到需要根据上下文环境来定义数组的情况,在运行期才能确知数组的长度。对于这种情况,C90及C++没有什么很好的办法去解决(STL的方法除外),只能在堆中创建一个内存映像与需求数组一样的替代品,这种替代品不具有数组类型,这是一个遗憾。C99的可变长数组为这个问题提供了一个部分解决方案。可变长数组(variable length array,简称VLA)中的可变长指的是编译期可变,数组定义时其长度可为整数类型的表达式,不再象C90/C++那样必须是整数常量表达式。在C99中可如下定义数组:int
阅读全文
摘要:在数学运算当中经常会涉及到判断两个数是否相等的情况对于整数很好处理 A==B这样的一个语句就可以解决全部的问题但是对于浮点数是不同的首先,浮点数在计算机当中的二进制表达方式就决定了大多数浮点数都是无法精确的表达的现在的计算机大部分都是数字计算机,不是模拟机,数字机的离散化的数据表示方法自然无法精确表达大部分的数据量的。其次计算机浮点数的精度在单精度float类型下,只有7位,在进行浮点运算的时候,这个精度往往会导致运算的结果和实际期望的结果之间有误差因为前两个原因,我们很难用 A==B来判定两个浮点数是否相同很自然,我们可以想到 fabs(A-B) < epsilon 这样的一种判别方法
阅读全文
摘要:首先,该表达式为错误表达式和未定义表达式。该表达式的解析顺序:++i++ ++ +i++ +i (1)算入优先级的话运算顺序为:(++((i++)++)) + (i++) + i (2)因为编译器在解析字符串时总是向后寻找可能的有意义的串,所以,这个解析式不会被解释为(++i++) + (++i++) + i (3)(2)式中第一个i先后置++得到i++(因为后置++优先级比前置++高),是一个右值,这个中间表达式再后置++就无法编译了,因为++运算符需要左值,而i++是右值(不信可以尝试在代码中写i++++,编译器会告诉你++需要左值)。另一方面,第一个(2)...
阅读全文
摘要:一 :关于指针和堆的内存分配 先来介绍一下指针 : 指针一种类型,理论上来说它包含其他变量的地址,因此有的书上也叫它:地址变量。既然指针是一个类型,是类型就有大小,在达内的服务器上或者普通的PC机上,都是4个字节大小,里边只是存储了一个变量的地址而已。不管什么类型的指针,char * ,int * ,int (*) ,string * ,float * ,都是说明了本指针所指向的地址空间是什么类型而已,了解了这个基本上所有的问题都好象都变的合理了。 在C++中,申请和释放堆中分配的存贮空间,分别使用new和delete的两个运算符来完成: 指针类型 指针变量名=new 指针类型 (初始化);
阅读全文
摘要:1.当看到这样一句指令mallov(strlen(str));,几乎就可以认为它是错误的,而mallov(strlen(str + 1));才是正确的,因为大家总是会忽略字符串结尾的'/0'字符2.ANSI字符中零的位模式被称为'NUL',用于结束一个ACSⅡ字符串,很多人都不知道哦3.switch语句中的case后面只能跟常量值或常量表达式,const都不可以,因其依旧是变量4.break statement within loop or switch,别指望break可以跳出别的什么东西哦5.ANSI C引入了一个新特性是相邻的字符串常量将被自动合成一个字符
阅读全文

浙公网安备 33010602011771号