C/C++
xc889078
这个作者很懒,什么都没留下…
展开
-
int *p=NULL和*p=NULL有什么区别?
int *p = NULL 和*p = NULL 有什么区别? 很多初学者都无法分清这两者之间的区别。我们先看下面的代码: int *p = NULL; 这时候我们可以通过编译器查看p 的值为0x00000000。这句代码的意思是:定义一个指针变量p,其指向的内存里面保存的是int 类型的数据;在定义变量p 的同时把p 的值设置为0x00000000,而不是把*p 的值设置为0x转载 2013-04-13 14:25:41 · 2594 阅读 · 0 评论 -
qsort函数
/************************************************************************************************************************** void qsort(void *base, int nelem, unsigned int width, int (*cmp)(const void原创 2013-07-02 17:17:17 · 589 阅读 · 0 评论 -
判断大小端
#include union test{ int a; char b;};int main(){ union test t; t.a = 0x12345678;//如果是小端 在内存中从低地址到高地址依次存放 78 56 34 12 //如果是大端 在内存中从低地址到高地址依次存放 12 34 56 78 printf("%x\n",t.b);//如果是小端 打原创 2013-07-04 15:00:52 · 452 阅读 · 0 评论 -
C++学习笔记
1、为了减少时间开销,如果在类体中定义的成员函数中不包括循环等控制结构,C++系统会自动将它们作为内置(inline)函数来处理。2、在指定默认参数时,一般只需在函数声明时指定,函数定义时不必重复指定默认参数。如果函数定义时也指定了默认参数,其值应与函数声明时一致,如果不一致,编译系统以函数声明时指定的默认参数值为准,函数定义时指定的默认参数不起作用。3、在一个类中定义了全部是默认参数原创 2013-07-05 16:06:03 · 553 阅读 · 0 评论 -
char *a 和char a[] 的区别(指针和数组的区别)
转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004808.html在C/C++中,指针和数组在很多地方可以互换使用,这使得我们产生一种错觉,感觉数组和指针两者是完全等价的,事实上数组和指针是有很大的区别的。1.两者在含义上的区别。 数组对应着一块内存区域,而指针是指向一块内存区域。数组地址和容量在生命期里不转载 2013-04-27 16:37:15 · 510 阅读 · 0 评论 -
栈溢出(stack overflow)的原因及解决办法
原帖地址:http://blog.sina.com.cn/s/blog_606f9bd70100e51g.html 最近在做一个程序(VC6.0),功能大概有网络通信、数据库、绘图等。测试的时候程序一运行到某个函数就出现此错误,查了很多地方,试了很多解决办法,终于把问题解决了,写个日志提醒一下自己,也希望作为一个普遍解决办法让大家少费工夫(其他编译器也会出现同样的问题)。 大家都知转载 2013-04-14 14:03:24 · 10624 阅读 · 1 评论 -
数组指针和指针数组
转载地址:http://blog.csdn.net/touch_2011/article/details/69669801、数组指针(指向数组的指针)(1)数组在内存中的表示创建一个数组就是在内存里面开辟一块连续的空间,比如int a[4];就是在内存里面开辟了一个大小为4*sizeof(int)字节的内存空间。二维数组是特殊的一维数组。先来看一段代码:void mai转载 2013-05-09 19:41:53 · 547 阅读 · 0 评论 -
C语言的那些秘密之---函数返回局部变量
转载地址:http://blog.csdn.net/haiwil/article/details/6691854一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容转载 2013-05-08 22:01:29 · 499 阅读 · 0 评论 -
深入理解C++的动态绑定和静态绑定
转载地址:http://blog.csdn.net/chgaowei/article/details/6427731为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误。需要理解四个名词:1、对象的静态类型:对象在声明时采用的类型。是在编译期确定的。2、对象的动态类型:目前所指对象的类型。是在运行期决定的。转载 2013-09-08 20:12:45 · 716 阅读 · 0 评论 -
C语言字符串库函数的实现
转载地址:http://www.cnblogs.com/luxiaoxun/archive/2012/09/04/2670202.htmlC语言字符串库函数的实现也是笔试题常考的题目,以下代码没有严格测试,只是简单的实现://字符串长度int strlen(const char *str) { assert(str != NULL); int转载 2013-09-08 21:33:39 · 1045 阅读 · 0 评论 -
C/C++浮点数在内存中的存储方式
转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中,存放方式为 10000100(低地址单元) 00000100(高地址单元),因为I转载 2013-05-06 21:52:19 · 556 阅读 · 0 评论 -
sizeof()用法汇总
sizeof()功能:计算数据空间的字节数1.与strlen()比较 strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素。 而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。2.指针与静态数组的sizeof操作 指针均可看为变量类型的一种。所有指针变量的sizeof 操作结果均为转载 2013-04-14 14:04:02 · 508 阅读 · 0 评论 -
函数指针和指针函数
转载地址:http://blog.csdn.net/porscheyin/article/details/34616321.指向函数的指针(函数指针)来分析这样一个声明,void (*f) ( ); 虽然()的优先级高于*,但由于有括号存在,首先执行的是解引用,所以f是一个指针;接下来执行( ),表明f指向一个函数,这个函数不返回任何值。现在得出结论:f是一个指向不接受参数且不返回任何转载 2013-05-09 16:47:31 · 602 阅读 · 0 评论 -
类的sizeof
转载地址:http://blog.csdn.net/mishifangxiangdefeng/article/details/7859071 1、空类的sizeof是1。空类是指没有成员的类,类中的函数不占空间,除非是虚函数。class A{ public: A(){} ~A(){} void fun(){}};转载 2013-05-13 21:55:56 · 640 阅读 · 0 评论 -
实现itoa函数
转载地址:http://www.cnblogs.com/journeyonmyway/archive/2011/09/08/2170429.htmlchar *itoa(int value, char *string, int radix);int value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数,如2,8,10,16 进制等头文转载 2013-04-17 22:12:37 · 660 阅读 · 0 评论 -
strcpy和memcpy的区别
strcpy和memcpy都是标准C库函数,它们有下面的特点。strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。strcpy函数的原型是:char* strcpy(char* dest, const char* src);memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。me原创 2013-06-05 17:31:02 · 465 阅读 · 0 评论 -
减少内存碎片
内存碎片一般是由于空闲的连续空间比要申请的空间小,导致这些小内存块不能被利用。举个例:假设有一块一共有100个单位的连续空闲内存空间,范围是0~99。如果你从中申请一块内存,如10个单位,那么申请出来的内存块就为0~9区间。这时候你继续申请一块内存,比如说5个单位大,第二块得到的内存块就应该为10~14区间。如果你把第一块内存块释放,然后再申请一块大于10个单位的内存块,比如说20原创 2013-06-05 17:47:08 · 910 阅读 · 0 评论 -
__attribute__ ((packed)) 的作用
1.__attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。这个功能是跟操作系统没关系,跟编译器有关,gcc编译器不是紧凑模式的,我在windows下,用vc的编译器也不是紧凑的,用tc的编译器就是紧凑的。例如:在TC下:struct my{ char ch; int a;} sizeof(int)=转载 2013-04-13 14:26:09 · 473 阅读 · 0 评论 -
字节对齐问题资料小结
为什么要字节对齐?因为这样方便计算机读取数据。sp是栈指针,指向一个栈的顶,如果计算机要读栈区中的第二个数据值怎么办呢?当然是sp+第二个数据值的偏移地址,但是如何得到这个偏移地址呢?如果还要计算偏移地址就会降低读取速度,因此,如果我们一开始就规定好一个偏移量,就不用计算了,那当然是选一个最大偏移量了(不然最大字节的数据怎么装进去?)。于是就用字节对齐的方法存放数据。当然,转载 2013-04-13 14:26:52 · 689 阅读 · 0 评论 -
函数指针和指针函数
【函数指针】 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。1.函数指针定义函数类型 (*指针变量名)(形参列表);“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可转载 2013-04-13 14:24:39 · 439 阅读 · 0 评论 -
解决 multiple definition of***
假设前提:a.h头文件包含了全局变量,可能是变量也可能是函数,其他的多个C文件都需要调用a.h文件,编译时就会报错: multiple definition of *** 原因在于:由于工程中的每个文件都是独立的解释的,(即使头文件有#ifndef _x_h....#enfif )在其他文件中只要包含了此头文件就会独立的解释,然后生成每个文件独立的标示符。在编译器连接时原创 2013-04-13 14:10:21 · 1111 阅读 · 0 评论 -
C中的volatile用法
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。例如:volatile int i=10;int j = i;...int k = i;volati转载 2013-04-14 14:02:56 · 438 阅读 · 0 评论 -
!!n的用法
对于非零n,!n=0,!!n=!(0)=1;对于零n,!n=1,!!n=!(1)=0;所以,如果对n连续做两次反运算,即!!n,那么非零的n转换为true, 0转换为false。原创 2013-04-26 16:19:37 · 3778 阅读 · 0 评论 -
c++中的左移、右移运算
转载地址:http://blog.csdn.net/hengshan/article/details/6440549移位运算包含“逻辑移位”(logical shift)和“算术移位”(arithmetic shift)。逻辑移位:移出去的位丢弃,空缺位(vacant bit)用 0 填充。算术移位:移出去的位丢弃,空缺位(vacant bit)用“符号位”来填充,所以一般用在右移转载 2013-04-27 16:58:08 · 752 阅读 · 0 评论 -
((a+b) + abs(a-b))/2 的用法
((a+b) + abs(a-b))/2 用于找出两个数中的较大者如果a>b 则 ((a+b) + abs(a-b))/2 = (a + b + a - b) / 2 = a如果a原创 2013-05-07 10:58:06 · 1618 阅读 · 0 评论 -
(int)a和(int &)a区别
float a = 1.0f; cout < < (int)a < < endl; //1 cout 浮点数的 1.0f在内存里是这样表示的: 0011 1111 1000 0000 00000000 00000000(int&)a:将a的引用强制转换为整型,意思是a所在的内存,本来定义的时候为float类型,并初始为1.0f,但现在我要按int类型解释这原创 2013-05-06 22:03:18 · 771 阅读 · 0 评论 -
(x&y)+((x^y)>>1)用法
(x&y)+((x^y)>>1)用于计算两个值得平均值x&y 得到的值是x,y共有的值x^y 得到的值是x,y各自独有的值之和, >>1相当于除以2,即得到各自独有的值之和的平均值(x&y)+((x^y)>>1)两个值加在一起就是x,y总的平均值举个例子:x = 10 二进制为1010 = 2^3 + 2^1 = 8 + 2y = 6 二进制为0110 = 2^原创 2013-05-07 10:48:00 · 632 阅读 · 0 评论 -
const int *p、int * const p、int const *p
const int *p *p不可改 p可改int* const p *p可改 p不可改int const * p 等同于const int*p这里,我再补充以下三种情况。其实只要上面的语义搞清楚了,这三种情况也就已经被包含了。不过作为三种具体的形式,我还是简单提一下吧!情况一:int * pi指针指向const int i常量的情况const原创 2013-05-09 10:54:32 · 641 阅读 · 0 评论 -
const char * const * pp
const char *const * pp 实质上是定义了一个指向字符串的二级指针,蓝色的const 限制一级指针指向的内容不能修改,红色的const限制二级指针指向的内容不能修改。举例:1. 没有const的情况#includeint main(){ char *str[] = {"123","456"}; char原创 2013-05-10 10:47:30 · 1339 阅读 · 0 评论 -
无符号数表示负数
unsigned int u;u = 3; // 1u = -1; // 2u = -1u; // 3printf("%u\n", u); // 4printf("%d\n", u); // 5在 1 中,“3”的类型为 int,而左边是一个 unsigned int 类型的变量,所以进行 赋值时隐式转换,相当于:u = (unsigned int) 3,得到结果 3u原创 2013-05-10 15:54:00 · 9147 阅读 · 1 评论 -
栈中变量地址分配
#include #include int main(){ int x=35; char str[10]; strcpy(str,"123456789abc"); printf("%d\n",x); return 0;}结果输出0。为什么会这样呢?因为栈中是从高地址到低地址的顺序压栈,也就是说先压栈的变量x的地址要比后压栈的字符数组str的地址要高,我们可以将其地址打原创 2013-05-27 17:01:24 · 2127 阅读 · 1 评论 -
printf("%3s,%7.2s,%.4s,%-5.3s\n","CHINA","CHINA","CHINA","CHINA");
#include int main(){ printf("%3s,%7.2s,%.4s,%-5.3s\n","CHINA","CHINA","CHINA","CHINA"); return 0;}结果:解析:%3s, 格式输出字符串,右对齐,超出3个长度的,就全部输出;%7.2s, 输出字符串占7个位置,右对齐原创 2013-05-15 10:12:27 · 17495 阅读 · 0 评论 -
二维数组传参
原帖地址:http://hi.baidu.com/d_life/item/d0541834734335352f0f8155 先给出问题:像下面这样的数组,在函数中如何传参?也就是说如何保证虚参与实参类型一致。char str_arr[3][10] = {"yes","no","uncertain"};char *str_array[] = {"yes","no","unsure转载 2013-04-14 14:03:52 · 750 阅读 · 0 评论