![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++ 学习
文章平均质量分 63
syf442
这个作者很懒,什么都没留下…
展开
-
ASCII码表
ASCII码表十六进制十进制字符十六进制十进制字符000nul4064@011原创 2011-08-24 11:13:42 · 523 阅读 · 0 评论 -
C语言运算符表
运算符按照优先级大小由上向下排列,在同一行的运算符具有相同优先级。第二行是所有的一元运算符。 运算符解释结合方式() [] -> .括号(函数等),数组,两种结构成员访问由左向右! ~ ++ -- + - * & (类型) sizeof否定,按位否定,增量,减量,正负号,间接,取地址,类型转换,求大小由右向左转载 2009-09-23 10:42:00 · 314 阅读 · 0 评论 -
wcslen、lstrlen、strlen
声明:size_t strlen( const char *string ); size_t wcslen( const wchar_t *string ); int lstrlen( LPCTSTR lpString // string to count ); 返回值: strlen()返回ANSI字符串长度; wcslen()返回宽字符串长度; lstrlen()依据字符串具体参原创 2009-07-15 09:19:00 · 1002 阅读 · 0 评论 -
《 高质量C++编程指南 》学习重点六
7.8 有了malloc/free为什么还要new/delete ? malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不原创 2009-07-09 10:10:00 · 309 阅读 · 0 评论 -
Debug 和 Release 编译方式的本质区别
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起 Release 版错误,在此转载 2009-07-10 14:53:00 · 348 阅读 · 0 评论 -
C++编译器符号表有哪些内容?
C++编译器符号表有哪些内容?很早就想写一篇关于符号表的学习小结,可是迟迟不能下笔。其一是因为符号表在编译器的设计中占有举足轻重的地位【我们在学习编译原理的时候更多的是注重principles,而没有关心一个编译器的实现,所以符号表讲解的也比较少】,编译阶段的每“遍”都会和符号表打交道,本人只做过一个Mini C的编译器的前端部分,感觉功底不够;其二是因为我想在原来C语言的基础上,增加C++语转载 2009-07-09 15:29:00 · 3345 阅读 · 0 评论 -
函数调用原理
在C语言中,假设我们有这样的一个函数:int function(int a,int b) 调用时只要用result = function(1,2)这样的方式就可以使用这个函数。但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。也就是说,计算机不知道怎么给这个函数传递参数,转载 2009-07-09 14:56:00 · 771 阅读 · 0 评论 -
《 高质量C++编程指南 》学习重点八
8.4 运算符重载8.4.1 概念 在C++语言中,可以用关键字operator加上运算符来表示函数,叫做运算符重载。例如两个复数相加函数: Complex Add(const Complex &a, const Complex &b);可以用运算符重载来表示: Complex operator +(const Complex &a, const Com原创 2009-07-09 14:29:00 · 311 阅读 · 0 评论 -
《 高质量C++编程指南 》学习重点七
第8章 C++函数的高级特性对比于C语言的函数,C++增加了重载(overloaded)、内联(inline)、const和virtual四种新机制。其中重载和内联机制既可用于全局函数也可用于类的成员函数,const与virtual机制仅用于类的成员函数。 重载和内联肯定有其好处才会被C++语言采纳,但是不可以当成免费的午餐而滥用。本章将探究重载和内联的优点与局限性,说明什么情原创 2009-07-09 10:33:00 · 267 阅读 · 0 评论 -
《 高质量C++编程指南 》学习重点五
7.4指针参数是如何传递内存的? 如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么? void GetMemory(char *p, int num){ p = (char *)malloc(sizeof原创 2009-07-09 09:02:00 · 325 阅读 · 0 评论 -
C++中数组指针和指针数组彻底分析
当然我们一切都是从最简单的内建类型开始,最后我会做一些推广。先看一下基本的形式,我们从这里起步!--------------指针----------------int a=10;int *p=&a;-------------指针的指针-----------int b=20;int *p=&b;int **p2p=&p;-------------简单数组--------------转载 2009-07-08 10:07:00 · 1018 阅读 · 1 评论 -
字符指针的特别之处
字符指针的特别之处 如果我们对一个非字符的指针进行操作,方法是这样的: 定义:int a=7; int *p=&a; 或者 int a=7; int *p; p=&a; 或者 int a=7; int *p; *p=a; 输出指针的内容(即所指向空间的地址):cout 输出指针所指的内容(即指针内容所描述地址空间中的内容):cout 指针对于字符的处理却有些特殊,和前面的非字符转载 2009-07-08 09:56:00 · 514 阅读 · 2 评论 -
指针和数组名的区别
C/C++应该是大学里最先接触的编程语言,它们的重要性不言而喻。但是我始终抱着“数组名就是指针”的错误信条到现在,可能是因为大学老师错误的讲解使我一直保留着这种误解。指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用,所以也难免在学习中将两者混淆。这里介绍下指针和数组名的区别: 1.指针和数组名占据的内存空间大小不一样,如下程转载 2009-07-07 17:09:00 · 741 阅读 · 0 评论 -
野指针
野指针 指针是个很强大的工具,可是正因为它太强大,所以要操作它不是件易事。操作不当造成的野指针,甚至会引起系统死机等比较严重的后果。 如果程序定义了一个指针,就必须要立即让它指向一个我们设定的空间或者把它设为NULL,如果没有这么做,那么这个指针里的内容是不可预知的,即不知道它指向内存中的哪个空间(即野指针),它有可能指向的是一个空白的内存区域,可能指向的是已经受保护的区域,甚至可能指向转载 2009-07-07 16:30:00 · 285 阅读 · 0 评论 -
堆和栈的区别(转)
堆和栈的区别一、预备知识—程序的内存分配一个由C++编译的程序占用的内存分为以下五个部分:1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static转载 2009-07-07 15:12:00 · 297 阅读 · 0 评论 -
堆、栈及静态数据区详解
五大内存分区 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,转载 2009-07-07 14:16:00 · 268 阅读 · 0 评论 -
C判断文件存在
用函数access,头文件是io.h,原型: int access(const char *filename, int amode); amode参数为0时表示检查文件的存在性,如果文件存在,返回0,不存在,返回-1。 这个函数还可以检查其它文件属性: 06 检查读写权限 04 检查读权限 02 检查写权限 01 检查执行权限 00转载 2009-11-23 13:33:00 · 478 阅读 · 0 评论 -
我的__declspec总结
__declspec是微软的编译指示符,可以使用__declspec关键字来指定扩展属性。该扩展属性语法简化并标准化了对于C和C++语言的微软特定扩展。 declspec是declaration spec(声明说明),还是declaration specific的缩写?原创 2011-01-14 15:02:00 · 892 阅读 · 0 评论 -
__declspec关键字详细用法
<br />__declspec用于指定所给定类型的实例的与Microsoft相关的存储方式。其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI规范,而__declspec是一种扩展属性的定义。扩展属性语法简化并标准化了C和C++语言关于Microsoft的扩展。<br />用法:__declspec ( extended-decl-modifier )<br />extended-decl-modifier参数如下,可同时出现,中间有空格隔开: <br />align (C转载 2011-01-14 09:56:00 · 524 阅读 · 0 评论 -
printf 格式
printf()函数是格式输出函数,请求printf()打印变量的指令取决与变量的类型.例如,在打印整数是使用%d符号,在打印字符是用%c 符号.这些符号被称为转换说明.因为它们指定了如何不数据转换成可显示的形式.下列列出的是ANSI C标准peintf()提供的各种转换说明. 转换说明及作为结果的打印输出%a 浮点数、十六进制数字和p-记数法转载 2010-04-22 16:21:00 · 588 阅读 · 0 评论 -
C 中 extern 和 static
C语言中:extern :extern(外部引用)可以置于变量或者函数前,以标示变量或函数的定义在别的文件中,在一个文件中用到的extern这些变量或函数是外来的,不是本文件定义的,提示编译器遇到此变量和函数时在其他模块中寻找其定义。注意,只有其他文件中的全局变量才能被其他文件所extern。extern int val;注: 此处原创 2010-03-10 15:29:00 · 2435 阅读 · 1 评论 -
【荐】pragma指令
在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作.下面介绍了一下该指令的一些常用参数,希望对大家有所帮助!一. message 参数。message它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为: #pragma message("消息文本")当编译器遇到这条指令时就在编译输出窗口中将消息文本打转载 2009-12-25 16:20:00 · 470 阅读 · 0 评论 -
C中main参数
每一C程序都必须有一main()函数。命令行界面的程序,通常都需要输入命令行参数帮助程序执行。main函数:int main(int argc, char* argv[]) argc: 整形,为传给main()的命令行参数个数。 argv: 字符串数组,储存着运行参数。argv[0],为程序执行路径。argv[1],为在DOS 命令行中执行程序名后的第一个字符串原创 2009-12-21 10:28:00 · 364 阅读 · 0 评论 -
《C语言深度剖析》学习笔记三
1.10.3,void指针【规则 1-35】千万小心又小心使用void指针类型。按照 ANSI(American National Standards Institute)标准,不能对 void指针进行算法操作,即下列操作都是不合法的:void * pvoid;pvoid++; //ANSI:错误pvoid += 1; //ANSI:错误ANSI 标准之所以这样认定,是因为它坚持:进行算法操作的指原创 2009-12-14 11:39:00 · 1032 阅读 · 1 评论 -
《C语言深度剖析》学习笔记二
1.5,最冤枉的关键字----sizeof1.5.1,常年被人误认为函数sizeof是关键字不是函数,其实就算不知道它是否为 32个关键字之一时,我们也可以借助编译器确定它的身份。看下面的例子:int i=0;A),sizeof(int); B),sizeof(i); C),sizeof int; D),sizeof i;毫无疑问,32位系统下 A),B)的值为原创 2009-12-11 11:00:00 · 1266 阅读 · 0 评论 -
【荐】C程序的编译过程
编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-->可执行文件1.编译预处理读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理[析] 伪转载 2009-12-14 16:40:00 · 516 阅读 · 0 评论 -
关于scanf()缓冲区
C语言中的输入函数(包括scanf,getchar等)在接收键盘输入时,把输入放在了“输入缓冲区”。当scanf()、getchar()做输入操作时,以回车符作为结束标志,并把回车符 /n 包含在输入字符串中储存在缓冲区,再从输入缓冲区中取走输入字符串赋值给变量,但却没有取走回车符/n。再当我们二次调用scanf()时,scanf()函数被跳过,”得不到执行“。因为这时输入缓冲原创 2009-12-10 10:38:00 · 2831 阅读 · 3 评论 -
《C语言深度剖析》学习笔记
C 语言有32个关键字, sizeof 即为其中一个,而非函数。sizeof 计算对象所占内存空间大小。什么是定义?什么是声明?它们有何区别? 举个例子:A)int i;B)extern int i; 什么是定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名。但注意,这个名字一旦和这块原创 2009-12-10 16:09:00 · 1463 阅读 · 0 评论 -
不定参数函数的原理及应用
概述由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦;即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,有些人采用指针参数来解决问题.下面就c语言中处理不定参数数目的问题进行讨论. 定义大家先看几宏.在VC++6.0的include有一个stdarg.h头文件,有如下几个宏定义:#define _INTSIZEOF(n) ((sizeof(n)+sizeof转载 2009-12-07 14:57:00 · 423 阅读 · 0 评论 -
函数指针解析
概述 在很多情况下,尤其是读别人所写代码的时候,对 C语言声明的理解能力变得非常重要,而C语言本身的凝练简约也使得C语言的声明常常会令人感到非常困惑,因此,在这里我用一篇的内容来集中阐述一下这个问题。 问题:声明与函数 有一段程序存储在起始地址为 0的一段内存上,如果我们想要调用这段程序,请问该如何去做? 答案 答案是 (*(void (*)( ) )0)( )。看起来确实令人头大,那转载 2009-12-07 10:07:00 · 422 阅读 · 0 评论 -
【荐】C函数的参数传递过程
1.3 C函数的参数传递过程基础知识 函数调用的本质将在这里得到阐明。首先请读者理解堆栈的操作。函数和堆栈的关系密切,这是因为:C语言程序通过堆栈把参数从函数外部传入到函数内部。此外,在堆栈中划分区域来容纳函数的内部变量。 调用push和pop指令的时候,寄存器esp用于指向栈顶的位置--栈顶总是栈中地址最小的位置。push执行的结果,esp总是减少,pop则增加。转载 2009-12-07 14:19:00 · 841 阅读 · 1 评论 -
【荐】深入了解C
C语言生成的代码在执行效率上比其它高级语言都高.现在让我们来看看C语言生成的代码具体是什么样子的.当你看完本文对于C语言的了解一定会更深一步了.本文通过一个个实际案例程序来讲解C语言.研究案例一工具: Turboc C v2.0,Debug,MASM v5.0,NASM实例C程序:/* example1.c */char ch;int e_main() { e_putchar(ch);}目标转载 2009-12-07 13:58:00 · 424 阅读 · 0 评论 -
【荐】细说 #pragma pack(n)
在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。对于结构体,编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界( natural alignment )条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一转载 2009-12-02 14:58:00 · 342 阅读 · 0 评论 -
《 高质量C++编程指南 》学习重点三
6.6 引用与指针的比较引用是C++中的概念,初学者容易把引用和指针混淆一起。一下程序中,n是m的一个引用(reference),m是被引用物(referent)。 int m; int &n = m;n相当于m的别名(绰号),对n的任何操作就是对m的操作。例如有人名叫王小毛,他的绰号是“三毛”。说“三毛”怎么怎么的,其实就是对王小毛说三道四。所以n既不是m的拷贝,也不原创 2009-07-07 11:15:00 · 337 阅读 · 0 评论 -
字符指针数组及指向指针的指针
就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针。 先看下面的代码,注意看代码中的注解:#include iostream> #include string> using namespace std; void print_char(char* array[],int len);//函数原形声明转载 2009-07-08 10:34:00 · 469 阅读 · 0 评论 -
怎样实现数目不定的函数参数
2006-12-28 erran 实现方法一:自定义指针找到函数参数的下一个参数; // 例子 A : template T umin(T _a, ...) { T _r = _a; T* _p = &_a; int count = 1;转载 2009-07-14 14:12:00 · 244 阅读 · 0 评论 -
缓冲区(buffer)
什么是缓冲区? 缓冲区(buffer)这个中文译意源自当计算机的高速部件与低速部件通讯时,必须将高速部件的输出暂存到某处,以保证高速部件与低速部件相吻合. 后来这个意思被扩展了,成为"临时存贮区"的意思,所以才有 "很多文章说是缓冲区,为什么不说成指向char的指针",也才有vcmute(横秋)的"缓冲意味着先在这地方用着,用完就释放"这类的说法. 实际原创 2009-07-15 10:25:00 · 759 阅读 · 0 评论 -
char,TCHAR,WCHAR区别
#ifdef UNICODE typedef wchar_t TCHAR; #else typedef unsigned char TCHAR; #endif typedef unsigned char CHAR; typedef unsigned wchar原创 2009-07-15 10:13:00 · 270 阅读 · 0 评论 -
关于调用约定(cdecl、fastcall、、thiscall) 的一点知识
函数调用规范 当高级语言函数被编译成机器码时,有一个问题就必须解决:因为CPU没有办法知道一个函数调用需要多少个、什么样的参数。即计算机不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者和函数本身来协调。为此,计算机提供了一种被称为栈的数据结构来支持参数传递。 函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计转载 2009-07-14 13:59:00 · 327 阅读 · 0 评论 -
__declspec(dllexport)与.def文件
__declspec(dllexport)与.def文件在VC++中,如果生成DLL可以不使用.def文件。只需要在VC++的函数定义前要加__declspec(dllexport)修饰就可以了。但是使用__declspec(dllexport)和使用.def文件是有区别的。如果DLL是提供给VC++用户使用的,只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果D转载 2009-07-14 13:52:00 · 697 阅读 · 0 评论