C
文章平均质量分 88
Shawn.Hu
1
展开
-
typedef的四个用途和两个陷阱
用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量; 以下则可行: typedef char* PCHAR; // 一般用大写 PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针 虽然: char *转载 2010-04-18 14:52:00 · 613 阅读 · 0 评论 -
va_list va_start va_arg va_end
本文主要介绍va_start和va_end的使用及原理。 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解。typedef char* va_list;void va_start ( va_list ap, prev_param ); /* ANSI version */type va_ar转载 2013-07-12 19:36:41 · 685 阅读 · 0 评论 -
关键字volatile
作用volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.简单地说就是防止编译器对代码进行优化.比如如下程序:XBYTE[2]=0x55;XBYTE[2]=0x56;XBYTE[2]=0x57;XBYTE[2]=0x58;对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器就不能像对待纯粹的程序那转载 2013-03-28 15:17:11 · 639 阅读 · 0 评论 -
C语言运算符优先级
优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右 ()圆括号(表达式)/函数名(形参表) .成员选择(对象)对象.成员名转载 2012-03-18 23:31:14 · 855 阅读 · 0 评论 -
unsigned int 和 int 混合计算
<br />有符号数和无符号数在一起运算,不要以为遵循的仍然是短的向长的靠齐。以前我们知道,如果一个short和一个int在一起运算,首先编译器会将short自动转换为一个int类型中间变量,然后进行运算。但是有符号数和无符号数在一起运算的话,并不是这样。借此机会,串下整形数据转换的相关知识。<br /> 首先说说符号数和无符号数之间的转换。无符号数可以转换为有符号数,有符号数也可以转化为无符号整形,这之间的转换一般编译器也不会给出警告,因为这种转换不涉及到bit丢失的情况,内存内容不会发生任何转载 2010-10-14 09:29:00 · 2329 阅读 · 0 评论 -
gdb
<br /><br />测试用源代码。<br />#include <stdio.h><br /><br />int test(int a, int b )<br />{<br /> int c = a + b ;<br /> return c;<br />}<br /><br />int main(int argc, char* argv[])<br />{<br /> int a = 0x1000;<br /> int b = 0x2000;<br /> int c = test(a, b )转载 2010-09-30 16:37:00 · 648 阅读 · 0 评论 -
可变长数组在GCC编译器中的实现
<br />在C99中新加入了对变长数组的支持,即数组的长度可以由某个非const变量来定义。可变数组的空间大小直到程序运行时才能确定,因此只有程序在运行时才能为程序分配空间。在gcc编译器程序会在运行时根据实际指定的大小(变量当前的值)调节esp的值,为数组在栈上分配适当大小的空间。由于要在运行时才能为数组分配空间,在开始分配空间之前空间的大小是不确定的,因此分配空间的起始地址也是不确定的(例如要在栈上分配两个可变长数组的情况下)。为了在以后的代码中对可变长数组的内容进行引用操作,程序必须通过某种方式获取转载 2010-09-30 18:58:00 · 1206 阅读 · 0 评论 -
C++虚函数
<br /> 下面是对C++的虚函数这玩意儿的理解。 一, 什么是虚函数<br /> (如果不知道虚函数为何物,但又急切的想知道,那你就应该从这里开始) <br /> 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。下面来看一段简单的代码 <br /> class A{ <br /> public: <br /转载 2010-09-06 12:28:00 · 461 阅读 · 0 评论 -
堆、栈及静态数据区详解
<br />五大内存分区<br /> 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。<br /> 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。<br /> 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。<br /> 自由存储区,就是那些由m转载 2010-09-05 21:49:00 · 498 阅读 · 0 评论 -
由类的成员函数深入指针
<br />先看这样一段代码<br />class test <br />{ <br />public: <br />test(int i){ m_i=i;} <br />test(){}; <br />void hello() <br />{ <br />printf("hello/n"); <br />} <br />private: <br />int m_i; <br />}; <br />int main() <br />{ <br /> test *p=new test(); <br /> p-转载 2010-09-06 12:26:00 · 448 阅读 · 0 评论 -
C 和 C++中的CONST
<br />C中的CONST C中CONST的使用: <br /> 虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题。 <br /> 问题:const变量 & 常量 <br /> 为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢? <br /> const int n = 5; <br /> int a[n]; <br /> 答案与分析: <br /> 1)、这个问题讨论的是“常量”与“只转载 2010-09-02 11:35:00 · 528 阅读 · 0 评论 -
const char,char const,const char*,char* const
const char与char const相同,都是都表示标识一个char的变量不能改变它的值,例如:<br />const char a = 'a'; //a变量就只能够是'a'了,不能再改变它的值<br /><br />const char* p1 = &a;<br />char* const p2 = &a;<br />*p1不能改变;<br />p2不能改变;<br />主要看待究竟const是否修饰*号(即*号是否在const后面)就行,如果修饰,则代表是*p是常量,如果不修饰则p是常量。<br转载 2010-06-22 15:57:00 · 825 阅读 · 0 评论 -
(void)(&x == &y)妙用
<br />今天看代码时看到一个有趣的东东,就是linux内核也有min函数,但它的实现很是奇怪,先贴出来:<br />在linux/types.h中的程序如下:<br />view plaincopy to clipboardprint?<br />#ifndef _TYPES_H_ <br />#define _TYPES_H_ <br /> <br />#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) <br /> <br />typede转载 2010-06-06 19:59:00 · 1824 阅读 · 0 评论 -
C复杂声明
C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。右左法则的英文原文是这样说的: The right-left rule: Start reading the declaration from the innermost parentheses, go right,转载 2010-06-04 15:02:00 · 3703 阅读 · 0 评论 -
C preprocessor
http://en.wikipedia.org/wiki/C_preprocessor C preprocessorFrom Wikipedia, the free encyclopediaJump to:navigation, search The C preprocessor (cpp) is the preprocessor for the C progr转载 2010-05-31 09:46:00 · 2651 阅读 · 0 评论 -
#pragma pack
http://baike.baidu.com/view/2317161.htm 一、n字节的对齐方式 VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。 VC中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n转载 2010-04-18 14:53:00 · 531 阅读 · 0 评论 -
关于 extern inline
http://wangcong.org/blog/archives/2021(本文是《C语言编程艺术》的一部分,转载请注明出处,勿用于商业用途。)大家一定对C语言 inline 关键字不陌生,甚至经常用到 static inline 的函数。可能感到陌生的是 extern inline。C11 标准在6.7.4 p7 中对此进行了描述,不过比较生涩难读。简单地讲,static转载 2013-08-16 16:55:42 · 1030 阅读 · 0 评论