C++与C语言
鸭脖
爱学习
展开
-
C语言中的strlen与sizeof的区别
sizeof与strlen是有着本质的区别,sizeof是求数据类型所占的空间大小,而strlen是求字符串的长度,字符串以/0结尾。区别如下:(1) sizeof是一个C语言中的一个单目运算符,而strlen是一个函数,用来计算字符串的长度。(2)sizeof求的是数据类型所占空间的大小,而strlen是求字符串的长度实例1:printf("char=%d/n",转载 2013-10-12 19:04:12 · 32990 阅读 · 4 评论 -
malloc,calloc,realloc等内存分配函数区别
三个函数的声明分别是:void* realloc(void* ptr, unsigned newsize);void* malloc(unsigned size);void* calloc(size_t nelem, size_t elsize);都在stdlib.h函数库内它们的返回值都是请求系统分配的地址,如果请求失败就返回NULLmalloc用于申请一段新的地转载 2013-01-03 15:27:53 · 569 阅读 · 0 评论 -
关于浮点数的一些概念
今天结合计算机组织与体系结构以及深入理解计算机系统这两本书,又系统地把浮点数给看了一遍。现在系统的把几个要点给总结一下:1、浮点数的三个域:符号域,指数域和分数域。float和double对应的位数分别为:1,8,23和1,11,522、指数域是偏值形式的,也就是真正的指数+偏值才是指数域所表示的值。float和double的偏值分别是127和1023.由于8位和11位指数域对应的无符号数原创 2013-01-03 23:57:19 · 1688 阅读 · 0 评论 -
语法错误 : 缺少“;”(在“类型”的前面)的解决方案
今天测试了一个以.c结尾的C语言程序。原始代码如下:[cpp] view plaincopy#include #include int main(int argc, char **argv) { fprintf(stdout, "Hello C\n"); int i; for (转载 2013-01-02 20:48:59 · 2190 阅读 · 0 评论 -
结构体成员对齐的问题
现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。(1)现象 比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读转载 2013-01-02 13:44:55 · 506 阅读 · 0 评论 -
dll、Lib、obj、.h文件的区别与作用
obj: 目标文件,一般是程序编译后的二进制文件,通过链接器和资源文件链接后就成为exe文件(链接器将使用这些文件生成EXE文件)。 obj只给出了程序的相对地址,而EXE是绝对地址。 CPP对应的二进制代码格式,是未经重定位的! lib:是若干个obj的集合,本质与obj相同! lib有静态lib和动转载 2012-12-17 23:18:36 · 1577 阅读 · 0 评论 -
命令行下编译多个C/CPP文件
上次我讲了ms 的nmake命令来进行编译多个cpp文件。这次我想一步步的自己来,不再通过makefile的帮助。首先注意以下几点:1、#include指令的机制就是讲.h文件中的内容复制到.cpp文件中,所以你只需要编译cpp文件。h文件只是一个陪衬。另外注意.h中的声明语句一定要记得在最后加上分号表示结束,否则编译程序会报错。你可以把h文件省去而直接加到cpp文件中,但是在之后原创 2012-12-17 23:15:17 · 3747 阅读 · 2 评论 -
选择问题——选取第K小元素
今天看到腾讯的一道面试题目,感觉都考的特别基础,但是自己有时候真的是学的不好,所以现在记下来:查找最小的k个元素题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7,8这8个数字,则最小的4个数字为1,2,3,4这道题目其实就是书上的k小选择问题,在讲述排序算法的时候其实已经都讲过了,只不过当时是输出一个但是现在是输出k个,都一样啊,你找出第k个元素之原创 2012-12-16 14:22:46 · 4423 阅读 · 0 评论 -
VC下的nmake
今天在VC的bin目录下发现了一个别nmake,查了查资料发现它用处还不小.,我们的编译还要依靠它,平时我们在用VC的时候点一下编译图标便什么都有了,具体怎么实现编译的呢?其实分两步: 第一步,把每一.c or .cpp文件编译成.obj文件。 第二步,用link把每一个.obj文件和库文件连接起来生成.exe。 而nmake的作用是把两步合并起来,编译和连接同时进行。转载 2012-12-15 21:02:10 · 798 阅读 · 0 评论 -
C语言查看变量字节程序
#includetypedef unsigned char* byte_pointer;void show_bytes(byte_pointer start,int n){int i;for(i=0;iprintf("%.2x",start[i]);}printf("\n");}原创 2013-01-03 15:29:20 · 1390 阅读 · 0 评论 -
浮点数的舍入问题
《计算机硬件技术基础》第2章39页表2-5舍入控制中的就近舍入(偶)这个问题,对它不太明白,不知道什么意思。请您讲解一下,并且请您举个例子。解答: 表的下面有一段文字进行了解释: 例如有效数字超出规定数位的多余数字是1001,它大于超出规定最低位的一半(即0.5),故最低位进1。如果多余数字是0111,它小于最低位的一半,则舍掉多余数字(截断尾数、截尾)即可。对于多余数字是1000原创 2013-01-04 12:46:41 · 11046 阅读 · 0 评论 -
CMM编译器和C编译器过程调用实现的比较
之前写了一个cmm的解释器,并且自己设计实现了函数调用。当时设计的时候并没有看c编译器是如何实现的,不过今天看了深入理解计算机系统之后,发现我的设计方法和c的还真的特别像,现在就简单总结一下,因为里面涉及了很多的汇编知识,所以不懂汇编的童鞋最好先看一下汇编:首先我想说的是一个最重要的思想,那就是相对寻址的思想,如果没有这个方法,那么编写过程调用几乎是不可能的。因为计算机指令是以变量的地原创 2013-01-04 16:16:59 · 1322 阅读 · 0 评论 -
常见的不不能声明为虚函数
常见的不不能声明为虚函数的有:普通函数(非成员函数);静态成员函数;内联成员函数;构造函数;友元函数。1、为什么C++不支持普通函数为虚函数? 普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时邦定函数。2、为什么C++不支持构造函数为虚函数? 这个原因很简单,主要是从语义上考虑,所以不支持。因为构转载 2013-06-16 00:26:45 · 651 阅读 · 0 评论 -
c++ 虚继承详解
#include using namespace std;class A{ virtual void f(){};};class B : public virtual A{ virtual void f(){};};class C: public virtual A{ virtual void f(){}; virtual void t(){转载 2013-05-03 20:22:58 · 1030 阅读 · 1 评论 -
验证virtual函数的原理
#include using namespace std;class Base{public:virtual void f() { cout virtual void g() { cout virtual void h() { cout };#include "Base.h"#include using namespace std;原创 2013-04-25 22:43:28 · 747 阅读 · 0 评论 -
详解C/C++函数指针声明
要理解一个C程序,仅仅理解组成该程序的符号是不够的。程序员还必须理解这些符号是如何组合成声明、表达式、语句和程序的。 我们先来看看下面的一个语句:?1( *( void(*)())0)(); 这是当计算机启动时,硬件将调用首地址为0位置的子例程。像这样的表达式恐怕转载 2013-04-24 10:49:26 · 744 阅读 · 0 评论 -
虚函数实现原理(转)
前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我转载 2013-04-24 10:44:33 · 541 阅读 · 0 评论 -
不用第三个变量,直接交换两个变量的值
记得曾经看过不用引进第三个变量而直接变换两个变量的值的例子。见过的两种方法如下:方法一:var a=1;var b=2;a=a+b;b=a-b;a=a-b;输出a,b可以发现两值已经交换 方法二:var a=1;var b=2;a=a^b;b=a^b;a=a^b;输出a,b可转载 2013-04-24 10:02:08 · 947 阅读 · 0 评论 -
中缀表达式的计算,C++版本,Linux环境
今天在ubuntu下用c++写了中缀表达式的计算,并且用g++编译链接好。写了一个makefile命令。如果有需要可以从我的资源中下载。原创 2013-01-16 20:21:48 · 683 阅读 · 0 评论 -
数学建模竞赛中应当掌握的十类算法
1 十类常用算法 1. 蒙特卡罗算法。该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时可以通过模拟来检验自己模型的正确性,几乎是比赛时必用的方法。 2. 数据拟合、参数估计、插值等数据处理算法。比赛中通常会遇到大量的数据需要处理,而处理数据的关键就在于这些算法,通常使用MATLAB 作为工具。 3. 线性规划、转载 2013-01-22 21:09:50 · 3556 阅读 · 0 评论 -
关于利用数组名获取数组大小的一点误区 - [C&CPP]
众所周知,在C++中,当我们使用一个数组参数作为一个函数的参数的时候,该数组名将会退化为一个指针。另,我们知道在C++中可以使用sizeof(a)获取数组a的大小(多少个字节);但常常我们在对一个从形参传进来的数组怎么获取长度了,还可以使用sizeof(a)吗?答案是否定的。 因为经过了实参到形参的转换,该数组名已经退化为一个名副其实的指针了(操作系统将会重新生成一转载 2012-12-15 21:33:32 · 1305 阅读 · 0 评论 -
关于内存中栈和堆的区别
原文:http://blog.csdn.net/nileel/archive/2009/06/29/4307284.aspx1、内存分配方面: 堆:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式是类似于链表。可能用到的关键字如下:new、malloc、delete、free等等。 栈:由编译器(Com转载 2012-12-26 12:57:37 · 723 阅读 · 0 评论 -
ssd6 exercise2
挺有意思/* * bits.c - Source file with your solutions to the Lab. * This is the file you will hand in to your instructor. */#include "btest.h"#include /* * Instructions t原创 2012-11-18 18:45:28 · 1947 阅读 · 0 评论 -
c++指针使用经验总结之悬垂指针
如果将作用域A的变量地址赋给在作用域B的变量指针。当A中相应变量的生存周期结束后,会使B的指针出现“悬垂指针”的现象(悬垂指针指向曾经存放对象的内存,但该对象已经不再存在了。悬垂指针往往导致程序错误,而且很难检测出来。)如下代码:#include#include using namespace std;int *p=NULL;void fun(){转载 2012-04-21 12:55:45 · 977 阅读 · 0 评论 -
正斜杠和反斜杠
学计算机这么久了,你能分清吗?恐怕不能吧,好吧,下面让渤哥总结一下正斜杠和反斜杠的区别吧。 最简单的区别就是位置了,你看看键盘,上面的是反斜杠,下面的是正斜杠,额,有点像中国部分的地区的势力唉,********我不想被河蟹!。。 好了,第二个区别便是正斜杠/表示除法,分隔。在windows系统中通常用来分隔命令行参数,/表示选项等。不能作为文件名。反斜杠\,在windo原创 2012-04-21 12:53:37 · 7918 阅读 · 2 评论 -
C++多态性
对C++多态学习的一点感受 原创:郭萌 2002年9月3日 多态考虑的是类与类之间的层次关系以及类自身内部特定成员函数之间的关系问题,是解决功能和行为的再抽象问题。多态是指类中具有相似功能的不同函数是用同一个名称来实现,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数。这也是人类思维方式的一种直接模拟,比如一个对象中有很多求两个数最大值的行为,转载 2012-04-21 12:58:19 · 604 阅读 · 0 评论 -
在命令行下使用vs的编译器
记得以前设置过,不过今天在使用的时候又忘了怎么设置了,又琢磨了好半天。为了防止以后再次忘记,我今天在这记一下:假设我的vs装在D:\vs2010目录下1、肯定要改path,加的是VC下的bin2、如果这个时候在命令行下cl,会弹出警告框,说缺少mspdb100.dll,这个时候需要把D:\vs2010\Common7\IDE添加至path中,原因自己查吧原创 2012-04-21 12:36:56 · 1198 阅读 · 0 评论 -
程序运行过程中的内存活动
预备知识在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一原创 2012-04-21 12:57:35 · 1722 阅读 · 0 评论 -
符号编码-ASCII、Unicode、Unicode big endian、UTF-8之间的关系(转)
1. ASCII 码我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位( bit )有 0 和 1 两种状态,因此八个二进制位就可以组合出 256 种状态,这被称为一个字节( byte )。也就是说,一个字节一共可以用来表示 256 种不同的状态,每一个状态对应一个符号,就是 256 个符号,从 0000000 到 11111111 。上个世纪 6转载 2012-04-21 12:38:54 · 865 阅读 · 0 评论 -
getline函数
在我的印象中,getline函数经常出现在自己的视野里,模糊地记得它经常用来读取字符串。但是又对它的参数不是很了解,今天又用到了getline函数,现在来细细地总结一下:首先要明白设计getline函数的目的,其实很简单,就是从流中读取字符串。而且读取的方式有很多,包括根据限定符,根据已读取的字符的个数。从这个函数的名称来看,它的直观原创 2012-04-21 09:01:17 · 82882 阅读 · 4 评论 -
活动代码页简介
代码页是字符集编码的别名,也有人称"内码表"。早期,代码页是IBM称呼电脑BIOS本身支持的字符集编码的名称。当时通用的操作系统都是命令行界面系统,这些操作系统直接使用BIOS供应的VGA功能来显示字符,操作系统的编码支持也就依靠BIOS的编码。现在这BIOS代码页被称为OEM代码页。图形操作系统解决了此问题,图形操作系统使用自己字符呈现引擎可以支持很多不同的字符集编码。 早期IBM原创 2012-04-27 22:56:55 · 10066 阅读 · 0 评论 -
C++标准库头文件介绍
C++标准库头文件介绍出处:http://blog.csdn.net/mikewolf2007/archive/2009/05/25/4213387.aspxC++标准库的所有头文件都没有扩展名。C++标准库的内容总共在50个标准头文件中定义,其中18个提供了C库的功能。形式的标准头文件【 例外】其内容与ISO标准C包含的name.h头文件相同,但容纳了C++扩展的功能。在形式标准的头转载 2012-04-21 12:56:40 · 624 阅读 · 0 评论 -
关于五子棋电脑AI算法的一些思考
这个部分是一个重点,也是一个难点,也是一个队伍最有可能出彩的一部分。我看了一些资料,但是现在我有了新的想法。 大部分算法中,都要进行两步。第一步是优先级的计算,然后是打分。但是我在想能不能通过某种数学模式把这两种计算融合在一起。也就是说,我们能够从所打的分中间识别出优先级。这使我想到了数学十进制中的位。反正我最主要是从四个方向进行判定,所以某些优先级低的,我们在给其打分的时候,就将它的分数原创 2012-04-22 22:17:34 · 6684 阅读 · 0 评论 -
再谈c++类型转换
今天在研究字符编码的时候偶然想到一个问题,在ansi编码中,一个中文字符是用两个字节表示的,但是一个char是一个字节,那么如果我将一个中文字符赋值给一个char变量的话,打印输出会发生什么情况呢?试了一下,发现乱码,意料之中,显然计算机还是把这个中文字符拆成了两半,把其中的一般赋值给了变量a,那么赋给它的到底是哪一半呢?试一下便知道了,中文字符‘你’的十六进制编码是C4 E3,那么按照下原创 2012-04-23 11:28:58 · 596 阅读 · 0 评论 -
比酒量问题与二叉树搜索和路径问题
比酒量问题:有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开原创 2012-11-29 13:14:50 · 915 阅读 · 0 评论 -
从汇编语言理解C++传参方式
C++传参方式分为传引用和传值,传值是将参数的副本传入函数,传引用是将从参数的地址传给函数。由于刚刚学过汇编语言,而且我知道在调用函数之前会将函数的参数压入堆栈,那么我很自然想到了mov和lea。而是用vc的反汇编工具我验证了这一点。看如下程序:#include "stdafx.h"#includeusing namespace std;void Swap(int& a原创 2012-11-28 21:17:48 · 2948 阅读 · 0 评论 -
C与C++中struct使用的区别
今天参看了louden用c编写的编译器,发现其中一些地方使用struct很奇妙。所以又研究了一下struct的区别,并发现c和c++在某些地方是有区别的。struct作为类的一种特例,是用来自定义数据结构的,在编程的过程中是很有用的。C和C++的主要区别是:一个结构标记声明后,C语言必须在结构标记前加上struct才能作为结构类型名,而C++语言中,结构标记可以直接作为结构类型名使用。原创 2012-11-28 20:49:41 · 7526 阅读 · 0 评论 -
关于程序的编译和链接
一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器转载 2012-11-27 17:16:03 · 688 阅读 · 0 评论 -
ssd上一道题目引发的思考
+++++++++++++++++++++++++++++++++++++++++++++++++void callee(int * count) { count++;}int main (int argc, char *argv[]) { int count = 4; callee(&count); printf("%d", count);原创 2012-11-08 18:38:11 · 599 阅读 · 0 评论 -
系统程序设计学习笔记
今天主要看了作用域和传值传引用以及递归,都是十分典型的问题,而且我发现卡耐基上面讲的很不错,所以做一下笔记。首先是作用域,这里有一个典型的程序:#include int first;int second;void callee ( int first ){ int second; second = 1; first = 2;原创 2012-10-24 20:51:47 · 611 阅读 · 0 评论