const char * array[]和char * const array[]
摘要:int main(){ char abc[] = "abc"; char def[] = "def"; char * const array[] = {"abc", "def"}; char * const array2[] = {abc, def}; const char * array3[3] = {"abc", "def"}; //char * const array3[2]; //erro...
阅读全文
posted @
2010-07-05 09:47
︶ㄣ第二名
阅读(1440)
推荐(0)
用法char ch=getchar()正确性详解
摘要:《C陷阱与缺陷》 chap5.1 getchar函数在一般情况下返回的是标准输入文件中的下一个字符,当没有输入时返回EOF(一个在头文件stdio.h中被定义的值,不同于任何一个字符,一般C语言实现定义为-1)。这个程序乍一看似乎把标准输入复制到标准输出,实则不然。 原因在于程序中的变量c被声明为char类型,而不是int类型。这意味着c无法容下所有可能的字符,特别是,可能无法容下EOF。因此,最...
阅读全文
posted @
2010-05-31 10:58
︶ㄣ第二名
阅读(10902)
推荐(1)
C语言中的缓冲输出
摘要:程序的输出方式有两种:一种是及时输出,另一种是先缓存起来,然后大块输出。前者往往给系统造成很大的负担,影响程序性能。后者的实现,C语言通过函数 void setbuf ( FILE * stream, char * buffer );实现。此函数的功能是通知输入输出函数库中的函数,所有写入到stream的输出都应该使用buffer作为输出缓冲区,直到buffer缓冲区被填满,或者程序员显式调用in...
阅读全文
posted @
2010-05-31 10:15
︶ㄣ第二名
阅读(749)
推荐(0)
算术运算的溢出行为 and 一个数内存中表示1的个数
摘要:说明:1)函数numOnesInBinary采用的方法对正负数通用。2)【此处有疑问】 处,本人不理解,无符号数和有符号数算术运算得出的结果应该为无符号数,为何有一个输出-1呢?哪位高手碰巧看到此文,请赐教。3)&按位与,即按内存中的表示形式按位与。任何数与-1按位与,结果是本身。算术运算的溢出问题: C语言中存在两类整数算术运算,有符号运算和无符号运算。 在无符号算术运算中,没有所谓的“...
阅读全文
posted @
2010-05-28 17:36
︶ㄣ第二名
阅读(1201)
推荐(1)
内联函数、模板、头文件杂记
摘要:1)内联有可能是目标代码量或增或减,这取决于被内联的函数的大小。 2)内联那些包含循环或switch语句的函数是得不偿失的。 3)虚函数和递归函数一般不能声明为内联函数。因为虚函数在继承体系中必须取地址,及虚函数指针vptr。内联函数无内存地址。 4)析构函数一般包含隐藏的代码,一般不可内联。即慎重再类定义的.h文件中定义析构函数。 5)函数模板、类模板的声明和定义必须都放到头文件中。否则连接出...
阅读全文
posted @
2010-05-12 15:43
︶ㄣ第二名
阅读(824)
推荐(0)
头文件依赖
摘要:使用前置声明(forward declarations)尽量减少.h文件中#include的数量。 当一个头文件被包含的同时也引入了一项新的依赖(dependency),只要该头文件被修改,代码就要重新编译。使用前置声明可以显著减少需要包含的头文件数量。举例说明:头文件中用到类File,但不需要访问File的类定义,则头文件中只需前置声明class File;无需#include "file/b...
阅读全文
posted @
2010-05-12 15:33
︶ㄣ第二名
阅读(724)
推荐(0)
编译器的工作原理及过程
摘要:1. 预处理 此时编译器会扫描一个一个的C源文件,如果发现#include了某个.h文件,则把整个.h文件包含进.c文件中,形成一个新的.c文件(实际的实现过程可能不是这样,但原理是这样的)。同时进行相关预处理指令的解释工作,譬如将宏替换成实际的值。 2. 编译源文件 此时编译器会扫描经过第1步之后新生成的源文件,把源代码编译成机器码,生成目标文件。如果发现某个类型不是编译器自含的类型,如一些自定...
阅读全文
posted @
2010-05-12 15:14
︶ㄣ第二名
阅读(3503)
推荐(0)
register、volatile、restrict关键字
摘要:register 使用修饰符register声明的变量属于寄存器存储类型。该类型与自动存储类型相似,具有自动存储时期、代码块作用域和内连接。声明为register仅仅是一个请求,因此该变量仍然可能是普通的自动变量。无论哪种情况,用register修饰的变量都无法获取地址。如果没有被初始化,它的值是未定的。 volatile volatile告诉编译器该被变量除了可被程序修改外,还可能被其他代理...
阅读全文
posted @
2010-05-08 11:29
︶ㄣ第二名
阅读(2480)
推荐(1)
什么应该放在头文件?何为外连接?
摘要:什么应该放在头文件里 头文件为相关声明提供了一个集中存放的位置。头文件一般包含类的定义、枚举的定义、extern变量的声明、函数的声明、const int的定义、inline函数的定义。使用或者定义这些实体的文件要包含适当的头文件。头文件用于声明,而不用于定义 当设计头文件时,记住定义和声明的区别是很重要的。定义只可以出现一次,而声明可以出现多次。下列语句是定义,所以不应该放在头文件里:[代码...
阅读全文
posted @
2010-04-13 19:00
︶ㄣ第二名
阅读(2610)
推荐(0)
C语言/C++编译过程
摘要:1、编译预处理: 编译器读取C源程序,对其中的预处理命令(以#开头)和特殊符号进行处理。预处理命令包括主要包括三种,一是宏定义命令,二是条件编译指令,三是头文件包含指令。采用头文件的目的是使某些定义可以供多个不同的C源程序使用。在需要用到这些定义的C源程序中,只需加上#include语句即可,而不必重新定义一遍。预编译程序将头文件中的代码统统加入到源文件,进而产生输出文件。 除了以上三种预处理...
阅读全文
posted @
2010-04-11 17:35
︶ㄣ第二名
阅读(475)
推荐(0)
C语言小笔记
摘要:static 修饰全局变量 也就是static修饰的全局变量。作用域仅限于变量被定义的文件中,其他文件即使用 extern声明也没法使用它。static 修饰的函数 同静态全局变量,作用域仅限于方法定义的文件中。 函数前加 static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数...
阅读全文
posted @
2010-03-08 17:07
︶ㄣ第二名
阅读(349)
推荐(0)
C语言中动态内存管理函数
摘要:内存分配mallocfunction<cstdlib>void * malloc ( size_t size );Allocate memory blockAllocates a block ofsizebytes of memory, returning a pointer to the beginning of the block.The content of the newly ...
阅读全文
posted @
2010-01-23 22:26
︶ㄣ第二名
阅读(2121)
推荐(0)
C语言 字符串转化为数字
摘要:int atoi ( const char * str ) //Convert string to integer忽略str前方的空白,直到遇到第一个非空白字符,如果第一个非空白字符是正负号或者数字,则转换尽可能长的有效字符为数字。如果没有合法的转换返回0,如果转换后的值超过int表示范围,INT_MAX or INT_MIN is returned。long int atol ( const c...
阅读全文
posted @
2010-01-22 17:14
︶ㄣ第二名
阅读(5168)
推荐(0)
老调重谈:C语言中的指针和数组
摘要:在C语言中,有时候指针和数组等效,有的时候却不然。什么时候不同?1. 数组名本身就代表一个地址。指针代表地址的地址。所以,指针、数组的定义和可能有的多处的声明要严格匹配!不能将在一个地方定义的数组,在他处声明为指针。反过来也不行!(详见C专家p84)的 2. 指针和数组都可以在他们的定义中用字符串常量进行初始化。尽管看上去一样,但底层的实现机制却不同。定义指针时,编译器不为指针所指向的对象分配空间...
阅读全文
posted @
2010-01-20 17:19
︶ㄣ第二名
阅读(604)
推荐(0)
进程的虚拟地址空间,堆栈、堆、数据段、代码段
摘要:上图是进程的虚拟地址空间示意图。堆栈段: 1. 为函数内部的局部变量提供存储空间。 2. 进行函数调用时,存储“过程活动记录”。 3. 用作暂时存储区。如计算一个很长的算术表达式时,可以将部分计算结果压入堆栈。数据段(静态存储区): 包括BSS段的数据段,BSS段存储未初始化的全局变量、静态变量。数据段存储经过初始化的全局和静态变量。代码段: 又称为文本段。存储可...
阅读全文
posted @
2010-01-18 22:31
︶ㄣ第二名
阅读(8534)
推荐(0)
C语言中标准输入流、标准输出流、标准错误输出流
摘要:在Linux中,所有对设备和文件的操作都使用文件描述符来进行。Linux中一个进程启动时,都会打开3个文件:标准输入、标准输出和标准出错处理。这三个文件分别对应文件描述符0、1、2。在C语言中,在程序开始运行时,系统自动打开3个标准文件:标准输入、 标准输出、标准出错输出。通常这3个文件都与终端相联系。因此,以前我们所用到的从终端输入或输出都不需要打开终端文件。系统自定义了3个文件指针stdin、...
阅读全文
posted @
2010-01-18 16:17
︶ㄣ第二名
阅读(5659)
推荐(0)
X86架构下基本类型的内存存储,字节序
摘要:此随笔测试x86下如何存储int型数据:高地址位存储int的高位,低地址位存储int的低位。这种存储方式叫做小端格式。另外还有“大端格式”。看一个程序:代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--#include"st...
阅读全文
posted @
2010-01-17 16:30
︶ㄣ第二名
阅读(1600)
推荐(0)
principal point in my C study
摘要:1. sizeof() 和strlen()sizeof() and strlen() Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--1#include<stdio.h>2#include<string.h>34voidmain...
阅读全文
posted @
2010-01-13 08:56
︶ㄣ第二名
阅读(382)
推荐(0)
switch语句
摘要:[代码]上述同样的代码,若保存为switch.cpp编译,没有问题。要保存为switch.c编译,则在vc里面提示:error C2051: case expression not constant。这个switch语句展示了,在C语言中,const其实并不是“真正的常量”。再看这样一段代码:[代码]程序输出的结果:defaultTWO
阅读全文
posted @
2010-01-09 14:00
︶ㄣ第二名
阅读(376)
推荐(0)
C语言一个微妙的Bug
摘要:[代码]运行结果是不打印TRUE。解释:TOTAL_ELEMENT所定义的值是unsigned int类型,因为sizeof()返回类型是无符号数。if语句在signed int和unsigned int之间测试大小关系,所以d被提升为unsigned int类型。 -1转换成unsigned int 的结果将是一个非常巨大的正整数,导致if判断为假。解决方法:可以修改第四行为:#defineTO...
阅读全文
posted @
2010-01-07 21:02
︶ㄣ第二名
阅读(507)
推荐(1)