摘要:
日期与时间函数头文件中说明了一些用于处理日期和时间的类型和函数。其中的一部分函数用于处理当地时间,因为时区等原因,当地时间与日历时间可能不相同。clock_t和time_t是两个用于表示时间的算术类型,而struct tm则用于存放日历时间的各个成分。tm的各个成员的用途及取值范围如下:int tm... 阅读全文
posted @ 2014-04-05 21:24
二郎那个三郎
阅读(25473)
评论(0)
推荐(0)
摘要:
last modified: 2010-05-28输入与输出头文件定义了用于输入和输出的函数、类型和宏。最重要的类型是用于声明文件指针的FILE。另外两个常用的类型是size_t和fpos_t,size_t是由运算符sizeof产生的无符号整类型;fpos_t类型定义能够唯一说明文件中的每个位置的对象。由头部定义的最有用的宏是EOF,其值代表文件的结尾。1.1 文件操作1.1.1 fopen#include FILE *fopen(const char *filename, const char *mode);返回:成功为FILE指针,失败为NULL打开以filename所指内容为名字的文件, 阅读全文
posted @ 2014-04-05 21:16
二郎那个三郎
阅读(5689)
评论(0)
推荐(1)
摘要:
诊断assert#include void assert(int exp);assert宏用于为程序增加诊断功能。当assert(exp)执行时,如果exp为0,则在标准出错输出流stderr输出一条如下所示的信息:Assertion failed: expression, file filename, line nnn然后调用abort终止执行。其中的源文件名filename和行号nnn来自于预处理宏__FILE__和__LINE__。如果被包含时定义了宏NDEBUG,那么宏assert被忽略。 阅读全文
posted @ 2014-04-05 21:09
二郎那个三郎
阅读(4120)
评论(0)
推荐(1)
摘要:
实用函数在头文件中说明了用于数值转换、内存分配以及具有其他相似任务的函数。1 atof#include double atof(const char *str);把字符串str转换成double类型。等价于:strtod(str, (char**)NULL)。2 atoi#include int atoi(const char *str);把字符串str转换成int类型。等价于:(int)strtol(str, (char**)NULL, 10)。3 atol#include long atol(const char *str);把字符串str转换成long类型。等价于:strtol(str, 阅读全文
posted @ 2014-04-05 21:08
二郎那个三郎
阅读(5786)
评论(0)
推荐(0)
摘要:
字符串函数在头文件中定义了两组字符串函数。第一组函数的名字以str开头;第二组函数的名字以mem开头。只有函数memmove对重叠对象间的拷贝进行了定义,而其他函数都未定义。比较类函数将其变量视为unsigned char类型的数组。1 strcpy#include char *strcpy(char *str1, const char *str2);把字符串str2(包括'\0')拷贝到字符串str1当中,并返回str1。2 strncpy#include char *strncpy(char *str1, const char *str2, size_t count);把字 阅读全文
posted @ 2014-04-05 21:03
二郎那个三郎
阅读(23190)
评论(0)
推荐(1)
摘要:
字符类测试头文件中说明了一些用于测试字符的函数。每个函数的变量均为int类型,变量的值必须是EOF或可用unsigned char类型表示的字符,函数的返回值为int类型。如果变量满足所指定的条件,那么函数返回非0值(表示真);否则返回值为0(表示假)。这些函数包括2.1~2.11。在7位ASCII字符集中,可打印字符是从0x20(' ')到0x7E('~')之间的字符;控制字符是从0(NUL)到0x1F(US)之间的字符和字符0x7F(DEL)。1 isalnum#include int sialnum(int ch);变量为字母或数字时,函数返回非0值,否则 阅读全文
posted @ 2014-04-05 20:57
二郎那个三郎
阅读(5645)
评论(0)
推荐(0)
摘要:
1.定义 extern,外面的、外来的意思。那它有什么作用呢?举个例子:假设你在大街上看到一个黑皮肤绿眼睛红头发的美女(外星人?)或者帅哥。你的第一反应就是这人不是国产的。 extern就相当于他们的这些区别于中国人的特性。extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,下面的代码用到的这些变量或函数是外来的,不是本文件定义的,提示编译器遇到此变量和函数时在其他模块中寻找其定义。就好比在本文件中给这些外来的变量或函数带了顶帽子,告诉本文件中所有代码,这些家伙不是土著。此外extern也可用来进行链接指定。 也就是说extern有两个作用: 第一个,当它与"C 阅读全文
posted @ 2014-04-05 20:04
二郎那个三郎
阅读(1206)
评论(0)
推荐(0)
摘要:
什么是定义?什么是声明?它们有何区别?举个例子:A)int i;B)extern int i;(关于extern,后面解释)哪个是定义?哪个是声明?或者都是定义或者都是声明?我所教过的学生几乎没有一人能回答上这个问题。这个十分重要的概念在大学里从来没有被提起过!什么是定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名。但注意,这个名字一旦和这块内存匹配起来(可以想象是这个名字嫁给了这块空间,没有要彩礼啊。^_^),它们就同生共死,终生不离不弃。并且这块内存的位置也不能被改变。一个变量或对象在一定的区域内(比如函数内,全 阅读全文
posted @ 2014-04-05 19:27
二郎那个三郎
阅读(4232)
评论(0)
推荐(4)
摘要:
1.const 关键字也许该被替换为 readolny const是constant的缩写,是恒定不变的意思,也翻译为常量、常数等。很不幸,正是因为这一点,很多人都认为被const修饰的值是常量。这是不精确的,精确的说应该是只读的变量,其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容。或许当初这个关键字应该被替换为readonly。那么这个关键字有什么用处和意义呢? const推出的初始目的,正是为了取代预编译指令define,消除它的缺点,同时继承它的优点。我们看看它与define宏的区别。(很多人误以为define是关键字,在这里我提醒你再回到本章前面看看32个关键字里是否.. 阅读全文
posted @ 2014-04-05 19:17
二郎那个三郎
阅读(1466)
评论(0)
推荐(0)
摘要:
1. void avoid的字面意思是“空类型”,void *则为“空类型指针”,void *可以指向任何类型的数据。void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,看看下面的例子:void a;Visual C++6.0上,这行语句编译时会出错,提示“illegal use of type 'void'”。不过,即使void a的编译不会出错,它也没有任何实际意义。void真正发挥的作用在于:(1) 对函数返回的限定;(2) 对函数参数的限定。众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同 阅读全文
posted @ 2014-04-05 18:55
二郎那个三郎
阅读(837)
评论(0)
推荐(0)
摘要:
1.如何使用 malloc 函数不要莫名其妙,其实上面这段小小的对话,就是malloc的使用过程。malloc是一个函数,专门用来从堆上分配内存。使用malloc函数需要几个要求:内存分配给谁?分配多大内存?是否还有足够内存分配?内存的将用来存储什么格式的数据,即内存用来做什么?分配好的内存在哪里?如果这五点都确定,那内存就能分配。下面先看malloc函数的原型:(void *)malloc(int size)看到了没有,这里的返回类型是(void *),这是多巧妙的一个设计啊。malloc函数的返回值是一个void类型的指针,参数为int类型数据,即申请分配的内存大小,单位是byte。内存分 阅读全文
posted @ 2014-04-05 18:35
二郎那个三郎
阅读(16492)
评论(2)
推荐(3)
摘要:
1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子。1.1结构体成员指针未初始化struct student{ char *name; int score;}stu,*pstu;int main(){ strcpy(stu.name,"Jimy"); stu.score = 99; return 0;} 很多初学者犯了这个错误还不知道是怎么回事。这里定义了结构体变量stu,但是他没想到这个结构体内部char *name这成员在定义结构体变量stu时,只是给name这个指针变量本身分配 阅读全文
posted @ 2014-04-05 17:05
二郎那个三郎
阅读(5660)
评论(0)
推荐(0)
摘要:
对于程序员,一般来说,我们可以简单的理解为内存分为三个部分:静态区,栈,堆。很多书没有把把堆和栈解释清楚,导致初学者总是分不清楚。其实堆栈就是栈,而不是堆。堆的英文是heap;栈的英文是stack,也翻译为堆栈。堆和栈都有自己的特性,这里先不做讨论。陈正冲老师在此处打了一个比方:一层教学楼,可能有外语教室,允许外语系学生和老师进入;还可能有数学教师,允许数学系学生和老师进入;还可能有校长办公室,允许校长进入。同样,内存也是这样,内存的三个部分,不是所有的东西都能存进去的。静态区:保存自动全局变量和static变量(包括static全局和局部变量)。静态区的内容在总个程序的生命周期内都存在,由编 阅读全文
posted @ 2014-04-05 16:33
二郎那个三郎
阅读(1026)
评论(0)
推荐(0)
摘要:
那到底什么是野指针呢?怎么去理解这个“野”呢?我们先看别的两个关于“野”的词:野孩子:没人要,没人管的孩子;行为动作不守规矩,调皮捣蛋的孩子。野狗:没有主人的狗,没有链子锁着的狗,喜欢四处咬人。对付野孩子的最好办法是给他定一套规矩,好好管教。一旦发现没有按规矩办事就好好收拾他。对付野狗最好的办法就是拿条狗链锁着它,不让它四处乱跑。对付也指针肯怕比对付野孩子或野狗更困难。我们需要把对付野孩子和野狗的办法都用上。既需要规矩,也需要链子。前面我们把内存比作尺子,很轻松的理解了内存。尺子上的0毫米处就是内存的0地址处,也就是NULL地址处。这条栓“野指针”的链子就是这个“NULL”。定义指针变量的同时 阅读全文
posted @ 2014-04-05 16:27
二郎那个三郎
阅读(4301)
评论(0)
推荐(0)
摘要:
1.函数指针的定义 顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。看例子:A) char * (*fun1)(char * p1,char * p2);B) char * *fun2(char * p1,char * p2);C) char * fun3(char * p1,char * p2); 看看上面三个表达式分别是什么意思?C)这很容易,fun3是函数名,p1,p2是参数,其类型为char *型,函数的返回值为char *类型。B) 也很简单,与C)表达式相比,唯一不同的就是函数的返回值类型为char**,是个二级指针。A) fun1是函数名吗?回忆一下前面讲解数组.. 阅读全文
posted @ 2014-04-05 15:35
二郎那个三郎
阅读(124864)
评论(7)
推荐(18)
摘要:
1.一个实例+理论分析在了解数组和指针的访问方式前提下,下面再看这个例子:main(){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}打印出来的值为多少呢? 这里主要是考查关于指针加减操作的理解。 对指针进行加1操作,得到的是下一个元素的地址,而不是原有地址值直接加1。所 以,一个类型为T的指针的移动,以sizeof(T) 为移动单位。 因此,对上题来说,a是一个一维数组,数组中有5个元素,所以a的类型是数组指针;ptr是一个int 型的指针,ptr的类型是整 阅读全文
posted @ 2014-04-05 15:01
二郎那个三郎
阅读(6347)
评论(0)
推荐(0)
摘要:
先看下面的例子:int a[5];1.内存布局的示意图 所有人都明白这里定义了一个数组,其包含了5个int型的数据。我们可以用a[0],a[1]等来访问数组里面的每一个元素,那么这些元素的名字就是a[0],a[1]…吗?看下面的示意图:如上图所示,当我们定义一个数组a时,编译器根据指定的元素个数和元素的类型分配确定大小(元素类型大小*元素个数)的一块内存,并把这块内存的名字命名为a。名字a一旦与这块内存匹配就不能被改变。a[0],a[1]等为a的元素,但并非元素的名字。数组的每一个元素都是没有名字的。2.利用sizeof来研究数组的内存结构关系 那现在再来解决sizeof关键字时的几个问题.. 阅读全文
posted @ 2014-04-05 14:34
二郎那个三郎
阅读(2023)
评论(0)
推荐(0)
摘要:
1.一种直观的方法假设现在需要往内存0x12ff7c地址上存入一个整型数0x100。我们怎么才能做到呢?我们知道可以通过一个指针向其指向的内存地址写入数据,那么这里的内存地址0x12ff7c其本质不就是一个指针嘛。所以我们可以用下面的方法:int *p = (int *)0x12ff7c;*p = 0x100;需要注意的是将地址0x12ff7c赋值给指针变量p的时候必须强制转换。1.1 为什么在此处,我们敢往0x12ff7c这个地址赋值呢? 至于这里为什么选择内存地址0x12ff7c,而不选择别的地址,比如0xff00等。这仅仅是为了方便在VisualC++ 6.0上测试而已。如果你选择0x. 阅读全文
posted @ 2014-04-05 14:12
二郎那个三郎
阅读(17733)
评论(0)
推荐(0)
摘要:
1. int *p = NULL; 代表定义一个指向整型变量的指针p,然后p的值设为NULL,也就是设为0;用另一种方式说,就是对一个刚定义的指向整型变量的指针,赋初始值,让其指向0地址。 2. *p = NULL; 代表对一个由指针p指向的变量(什么类型,不知道),赋值为0,是将那个变量赋值为0。 我们可以先看下面的代码:int *p = NULL;这时候我们可以通过编译器查看p的值为0x00000000。这句代码的意思是:定义一个指针变量p,其指向的内存里面保存的是int类型的数据;在定义变量p的同时把p的值设置为0x00000000,而不是把*p的值设置为0x00000000。这个过程叫 阅读全文
posted @ 2014-04-05 13:53
二郎那个三郎
阅读(12176)
评论(0)
推荐(3)
摘要:
优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右()圆括号(表达式)/函数名(形参表).成员选择(对象)对象.成员名->成员选择(指针)对象指针->成员名2-负号运算符-表达式右到左单目运算符(类型)强制类型转换(数据类型)表达式++自增运算符++变量名/变量名++单目运算符--自减运算符--变量名/变量名--单目运算符*取值运算符*指针变量单目运算符&取地址运算符&变量名单目运算符!逻辑非运算符!表达式单目运算符~按位取反运算符~表达式单目运算符sizeof长度运算符sizeof(表达式)3/除表达式/表达式左到右双目运算符*乘表 阅读全文
posted @ 2014-04-05 13:50
二郎那个三郎
阅读(2662)
评论(0)
推荐(1)

浙公网安备 33010602011771号