博文

Const和#define大比拼(2007-08-13 22:57:00)

摘要:  const给人的第一印象就是定义常量。 (1)const用于定义常量。       例如:const int N = 100;const int M = 200;
      这样程序中只要用到 N、M 就分别代表为整型100、200,N、M 为一常量,在程序中不可改变。
      但有人说他编程时从来不用const定义常量。我相信。但他是不懂得真正的编程艺术,用const定义常量不仅能方便我们编程而且能提高程序的清晰性。你是愿意看到程序中100、200 满天飞,还是愿意只看到简单清晰的N、M。相信有没有好处你慢慢体会。
      还有人说他不用const定义常量,他用#define宏定义常量。可以。但不知道你有没有发现有时#define宏并没有如你所愿在定义常量。下面我们比较比较const和#define。
      1。
      (a) const定义常量是有数据类型的:
      这样const定义的常量编译器可以对其进行数据静态类型安全检查,而#define宏定义的常量却只是进行简单的字符替换,没有类型安全检查,且有时还会产生边际效应(不如你愿处)。所谓边际效应举例如下:
            #define N 100
            #define M 200 + N
            当程序中使用 M*N 时,原本想要 100 * (200+ N )的却变成了 100......

阅读全文(3940) | 评论:0

c语言中命令行参数argc,argv(2007-08-10 21:50:00)

摘要:c语言中命令行参数argc,argv关键词: argc,argv                                           main(int argc,char **argv)
argv为指针的指针
argc为整数
char **argv or: char *argv[] or: char argv[][]
main()括号内是固定的写法。

下面给出一个例子来理解这两个参数的用法:

假设程序的名称为prog,

当只输入prog,则由操作系统传来的参数为:

argc=1,表示只有一程序名称。
argc只有一个元素,argv[0]指向输入的程序路径及名称:./prog

当输入prog para_1,有一个参数,则由操作系统传来的参数为:

argc=2,表示除了程序名外还有一个参数。
argv[0]指向输入的程序路径及名称。
argv[1]指向参数para_1字符串。

当输入prog para_1 para_2 有2个参数,则由操作系统传来的参数为:

argc=3,表示除了程序名外还有2个参数。
argv[0]指向输入的程序路径及名称。
argv[1]指向参数para_1字符串。
argv[2]指向参数para_2字符串。



......

阅读全文(4749) | 评论:0

Windows快捷键大全(2007-05-30 17:16:00)

摘要:Windows快捷键大全 2007-05-12 23:51 一、常用快捷键 F1 显示当前程序或者Windows的帮助内容。 F2 当你选中一个文件的话,这意味着"重命名" F3 当你在桌面上的时候是打开"查找:所有文件" 对话框 F10或ALT激活当前程序的菜单栏 windows键或CTRL+ESC 打开开始菜单 CTRL+ALT+DELETE 在win9x中打开关闭程序对话框 DELETE 删除被选择的选择项目,如果是文件,将被放入回收站 SHIFT+DELETE删除被选择的选择项目,如果是文件,将被直接删除而不是放入回收站 CTRL+Z 撤消 CTRL+C 复制 CTRL+V 粘贴 CTRL+ESC 显示"开始"菜单 CTRL+N 新建一个新的文件 CTRL+O 打开"打开文件"对话框 CTRL+P 打开"打印"对话框 CTRL+S 保存当前操作的文件 CTRL+X 剪切被选择的项目到剪贴板 CTRL+INSERT 或 CTRL+C复制被选择的项目到剪贴板 SHIFT+INSERT 或 CTRL+V 粘贴剪贴板中的内容到当前位置 ALT+菜单上带下划线的字母执行菜单上相应的命令 ALT+F4 关闭当前窗口或退出程序 ALT+空格键 显示当前窗口的系统菜单 ALT+TAB 切换到另一个窗口 ALT+BACKSPACE 或 CTRL+Z 撤销上一步的操作 ALT+SHIFT+BACKSPACE 重做上一步被撤销的操作 Windows键+M 最小化所有被打开的窗口。 Windows键+CTRL+M重新将恢复上一项操作前窗口的大小和位置 Windows键+E 打开资源管理器 Windows键+F 打开"查找:所有文件"对话框 Windows键+R 打开"运行"对话框 Windows键+BREAK 打开"系统属性"对话框 Windows键+CTRL+F打开"查找:计算机"对话框 SHIFT+F10或鼠标右击 打开当前活动项目的快捷菜单 SHIFT在放入CD的时候按下不放,可以跳过自动播放CD。在打开Word的时候按下不放,可以跳过自启动的宏 ALT+F4 关闭当前应用程序 ALT+SPACEBAR打开程序最左上角的菜单 ......

阅读全文(1547) | 评论:0

字符数组和字符指针的区别(2007-05-28 22:16:00)

摘要:字符数组和字符指针的区别 char* s1="hello";
char  s2[]="world";
两个表达式的含义是一样的.
如果讲不同之处的话,VC6中编译时,对这两种定义进行了不同的处理;
char *s1 = "hello"; 中的"hello",编译时指针指向的区域位于PE文件的.rdata节中,是只读的.不信的话,你可以试试: main()
{
  char *s1="hello";
  char s2[]="world";   *(s2+2)='x'; //正确
  *(s1+2)='x'; //编译通过,运行时出错.
} 1.严格的说两个表达的意思是不完全一样的,因为前者是个字符串指针,这个指针S1所存的地址就是存储字符串"hello"的首地址。
2.而后者是字符数组。每个字符都有一个独立的地址。
不能这样写:
char ch[20];
ch="hehe"
ch表示数组地址,是常量,不能被赋值。 可以这样写:
char *ch;
ch="hehe"
这里是将字符串"hehe"的首地址赋给指针变量ch.......

阅读全文(2615) | 评论:0

变量的声明和定义以及extern的用法(2007-05-27 23:32:00)

摘要:变量的声明和定义以及extern的用法
                                        
变量的声明不同于变量的定义,这一点往往容易让人混淆。
l         变量的声明是告诉编译器,该变量名称已经存在,编译器认识这个名字,不会引起编译错误。
l         对变量进行定义之后,编译器就会给变量分配空间,链接时,链接器可以找到它们的地址。
在程序代码组织过程中,人们往往把变量的声明放在头文件中,而把变量的定义放在源文件中,如下面的例子所示(该例子在VC6.0中编译、链接通过):
file1.h
/////////////////////////////////////////////////////
// 文件名:file1.h
// 该文档用来测试extern的用法
// extern表示外部声明一个变量
// 声明一个变量就是告诉编译器,这个变量名已经存在
// 但是没有给它分配空间。也就是说,声明了一个变量
// 如果程序中引用了该变量,能够通过编译,但是,
// 如果没有在某个文件中定义该变量的话,则链接会出错
// 因为链接目标文件的时候,需要该变量的确切地址.
/////////////////////////////////////////////////////
 
#ifndef _FILE1_H
#define _FILE1_H
#include <iostream.h>
extern void FilePri......

阅读全文(4572) | 评论:0

C++ 变量和函数的声明和定义(2007-05-27 23:10:00)

摘要:C++ 变量和函数的声明和定义      有一部分C++程序员对于多个源文件一起编译链接时,变量,函数或者类声明和实现到底如何定义模糊不清,现在分类澄清一下。
 
变量 (variable)
 
      在C++中,变量声明(declaration)只有在使用extern关键字时才成立,其他情况下都是定义(definition),而在使用extern的同时给变量赋初始值,则声明变为定义,extern关键字也将被编译器忽略。C++变量的作用域缺省情况下是全局的,也就是对多个源文件可见,比如说,如果在a.cpp和b.cpp中都有int a;则编译器链接两个文件时会报告错误,“变量重复定义”。因此,要使变量定义只对该源文件可见,就要显式加上static关键字。因此,我们可以想到,如果在a.cpp中有extern int a;
而在b.cpp中有 static int a = 9; 那么,编译器链接时会给出错误信息,“找不到a的定义”,因为a的定义在b.cpp并只对该文件可见,a.cpp找不到a的定义因此出错。
 
      变量的声明和定义是比较容易混淆的概念,因此记住一点,除非有extern关键字,否则都是变量的定义。由此,我们可以归纳出几点好的程序设计风格:
      1. 不要把变量定义放入.h文件,这样容易导致重复定义错误。
      2. 尽量使用static关键字把变量定义限制于该源文件作用域内,除非该变量被设计成全局的。例外情况是const变量和typedef类型,在《The C++ Programming Language》9.2节中说到,const和typedef缺省作用域是局部的,因此不需要static来显式声明。因此,在.h文件中放置const变量定义不会产生问题,编译器会给每个引用该.h文件的源文件产生一份该const变量的局部定义,就像该变量是定义于该源文件中一样。大家也不用太担心编译器这么做会浪费空间......

阅读全文(3803) | 评论:0

C++指针变量作函数参数实例分析(2007-05-24 22:29:00)

摘要:#include<iostream>  
void   f(char   *a,char   *b)  
{    
 a=b;    
 (*a)++;  
 printf("after   *a++:a=%c ================= \n",*a);  
 printf("after   *a++:b=%c ================= \n",*b);  
}  
void main()  
{  
 char a1='A',a2='a',*p1,*p2;  
 p1=&a1;  
 p2=&a2;  
 f(p1,p2);  
 printf("%c",a1);  
 printf(" %c",a2);  
 printf("\n");
} 运行结果如下:
b  b
A  b
原因如下:
在函数f中形参a得到实参p1的值&a1,形参b得到实参p2的值&a2,而后a=b语句使得a和b同指向了a2,a和b都表示a2的地址。(*a)++将a2的值变为了b,在函数内输出的时候,*a和*b都表示a2的值,所以输出b   b 在主函数中的时候,p1,p2属于单值传递,p1 p2的值不能在函数结束后改变,只能进行实参向形参传数据,形参的值无法传回给实参。所以p1 p2在函数调用后指向依然分别是 a1 a2a1 为A a2在函数中改变了,所以输出A  b ......

阅读全文(2245) | 评论:0

常指针与指针常量的区别?(2007-05-22 16:32:00)

摘要:关键词: 常指针    指针常量                                           1 常量指针!如 int b, c; int * const a = &b;
表示a是一个常量指针它指向变量b的内存。但是因为是常量指针所以不能再用a指向其他变量,如 a = &c; 错误!可以修改指向内存的值,如:*a = 20; BTW 常量指针声明的时候必须向我那样赋初值。 2 指向常量的指针!如 int b, c; int const *a; a = &b; a = &c;
都可以,唯独它指向的内存不能被修改。如:*a=20;这是违法的!错误! 这就是主要区别! BTW 还有一个记住他们不同形式的技巧!看const关键字,他后面的不可修改,如int * const a = &b; 后面是a,则说明a不能修改!
int const * a = &b;后面是*a则说明*a不可被修改!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在好多书上或MSDN是经常用 const int a=5;
int b=6;
const int *p=&b;
其实 const int* 和int const* 一样,就是常指针 也就是它所指向的数据(在这是int)是常量,它自己的数据类型是const int*
还有const int *p=&b;是可以的 虽然b不是常量。
但是 const int a=6;
int *p=&a;
会报错,因为它消除了a的const属性
***************......

阅读全文(2318) | 评论:2

栈和堆的区别 (2007-04-22 16:28:00)

摘要:  栈和堆的区别 [老八 发表于 2007-1-4 21:28:08]
 
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似 于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与 数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静 态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后 有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
二、例子程序
这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地 方。
}   
二、堆和栈的理论知识
2.1申请方式
stack:
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如p1 = (char *)malloc(10);
在C++中......

阅读全文(1920) | 评论:2

写一个贪食蛇的思路,可以双人玩的  转(2007-03-21 12:34:00)

摘要:暑假的时候我自己写了个贪食蛇的小程序,觉得效果还好。现在我将自己的思路简单的说一下,我知道好多人都对这个经典的游戏有兴趣的, 我刚开始学编程的时候也是立志自己写一个,这个目标也算是完成了。写我自己的思路,也练练我的表达能力,要是说的不明不白,请多多见谅。下面这个帖子有这个程序的简单介绍和下载地址,可以去看看。《暑假的时候写了个贪食蛇,可单人或者双人玩》,http://www.programfan.com/club/showbbs.asp?id=188529
也是我发的,要是地址有错误可以搜索。

首先要解决的一个问题是如何来描述蛇的状态。蛇总是在一些小方格上面爬行的,假如横数有cxNumberOfRect个小格, 竖数有cyNumberOfRect个,就共有cxNumberOfRect*cyNumberOfRect个小格。对于每一个小格,经过简单的影射,可以用一个POINT来表示,也可以用一个二维数组的一个元素来表示。而蛇身是由一系列的方格来组成的,自然也可以用一系列的点,或者一个二维数组来描述。

先看第一个方法,就是用一系列的点来表示,其实不用组成蛇身的每个点都记录下来(点对应了方格), 只要记录下关键的点就可以的了. 什么点关键的呢, 自然是头, 尾, 和全部拐弯点. 光知道这些关键点还不够, 蛇爬行的时候还有一定的方向, 尾所在的点也有一定的方向, 在尾遇到拐弯点的时候, 方向也要改变, 所以拐弯点也要有一定的方向, 不然尾就不知道转向哪里了. 这时候, 就知道, 应该要有一个结构来记录每个点的状态, 一个元素是坐标, 可以是POINT类型, 一个用来记录方向, 可以是UINT类型, 我自己是这样定义的
#define        DS_UP        0x0001
#define     ......

阅读全文(3194) | 评论:0