博文
《彻底搞定C指针》第7篇 函数名与函数指针(2006-11-10 21:43:00)
摘要:《彻底搞定C指针》第7篇 函数名与函数指针
第7篇 函数名与函数指针
转于(白云小飞 blog)
一 通常的函数调用
一个通常的函数调用的例子:
//自行包含头文件
void MyFun(int x); //此处的申明也可写成:void MyFun( int );
int main(int argc, char* argv[])
{
MyFun(10); //这里是调用MyFun(10);函数
return 0;
}
void MyFun(int x) //这里定义一个MyFun函数
{
printf(“%d\n”,x);
}
这个MyFun函数是一个无返回值的函数,它并不完成什么事情。这种调用函数的格式你应该是很熟悉的吧!看主函数中调用MyFun函数的书写格式:
MyFun(10);
我们一开始只是从功能上或者说从数学意义上理解MyFun这个函数,知道MyFun函数名代表的是一个功能(或是说一段代码)。
直到——
学习到函数指针概念时。我才不得不在思考:函数名到底又是什么东西呢?
(不要以为这是没有什么意义的事噢!呵呵,继续往下看你就知道了。)
二 函数指针变量的申明
就象某一数据变量的内存地址可以存储在相应的指针变量中一样,函数的首地址也以存储在某个函数指针变量里的。这样,我就可以通过这个函数指针变量来调用所指向的函数了。
在C系列语言......
基于VC6的俄罗斯方块代码学习版源码(2006-11-10 21:30:00)
摘要:基于VC6的俄罗斯方块代码学习版源码(1)
转于http://yyf977.programfan.com
◆源代码下载链接:
http://upload.programfan.com/upfile/200610120711419.rar
◆本写代码的目的:
1.想以此小软件的开发示例演示面向对象软件工程方法的基本开发过程:
(我欲将随后将公开全部过程的UML图及相关思路。欢迎大家提出意见,进行讨论,以达共同进步的目的。)
2.对该游戏程序软件架构的一次探索:
本游戏特点是界面与逻辑有紧密的关系,如何将逻辑与界面实现相分离也是本代码的探索之处。努力实现面向对象的设计思路,代码所追求的目标是:整体结构合理,减小各功能类之间的耦合度,力求相关问题局部化,做到容易维护代码(如易于修正BUG和功能的扩展升级)。
3.本程序是对MFC对话框框架学习后的一次总结:
实现了由控制类控制下多个对话框之间切换的面向对象代码示例。本程序包含一个框架窗口,用以容纳子窗口。子窗口有三个:主界面窗口、设置窗口、游戏play窗口。这些窗口都是由对话框组成,框架窗口是一模态对话框,其它各窗口为非模态对话框。
4.对关卡类游戏的一次实践:
本游戏与我之前扫雷游戏的一个不同是它由一关一关游戏组成,所以不仅仅是一局游戏的实现,还要实现由一关进入另一关之间的游戏流程,本设计演示了此类游戏进行面向对象方法设计的一个示例。
5.对有定时需求游戏实现的一次探索:
本游戏与扫雷游戏的另一个不同是它有定时要求,对于游戏有定时要求的面向对象软件设计不是直觉感觉的那么简单,如何看待定时器这个对象,如何实现与它相关的代码动作也是本设计想要探讨的问题。
◆类说明:
1.游戏界面类:
IView:抽象类,作为各对话框的公共接口,提供接受控制类的通知响应管理。
&n......
sprintf函数 sizeof()操作符说明(2006-11-10 21:22:00)
摘要:sprintf函数的用法
自《CSDN 社区电子杂志——C/C++杂志》
在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。
sprintf 是个变参函数,定义如下:
int sprintf( char *buffer, const char *format [, argument] ... );
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:
格式化字符串上。
printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。
格式化数字字符串
sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf 在大多数场合可以替代
itoa。
如:
//把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //产生"123"
可以指定宽度,不足的左边补空格:
sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"
当然也可以左对齐:
sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"
也可以按照16 进制打印:
sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐
sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐
这样,一个整数的16 进制字符串就很容易得到,但我们在打印16 进制内容时,通常想要一种左边补0 的等宽格式,那该怎么做呢?很简单,在表示宽度的数字前面加个0 就可以了。
sprintf(s, "%08X", 4567); //......
C/C++ 试题剖析(2006-11-10 21:19:00)
摘要:strcpy()与strlen()、sizeof()的区别
char s1[6]="china" ,s2[3]="ch";
strcpy(s1,s2);
请问内存中ina部分的数据是否被覆盖??
S1的内容是ch,还是china??
S1的长度是6??
strcpy(s1,s2); strcpy函数的意思是:把字符串s2中的内容copy到s1中,连字符串结束标志也一起copy.
这样s1在内存中的存放为:ch\0
如果说s1的长度是6,那是错误的.你没有弄清strlen与sizeof的意思。
strlen函数的意思是测试字符串的字符长度,不含字符串结束标志的。
sizeof是个运算符,它的结果是字符串在内存中的所占字节大小,它要把\0算进去的
C/C++ 试题剖析(2)
试题3:
void test3(char* str1)
{
char string[10];
if( strlen( str1 ) <= 10 )
{
strcpy( string, str1 );
}
}
if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’\0’所占用的1个字节。
考查对基本功的掌握:
(1)字符串以’\0’结尾;
(2)对数组越界把握的敏感度;
(3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:
2分
void strcpy( char *strDest, char *strSrc )
{
while( (*strDest++ = * strSrc++) != ‘\0’ );
}
4分
void strcpy( char *strDest, const char *strSrc )
//将源字符串加const,表明其为输入参数,加2分
C/C++ 学习笔记(2006-11-10 21:14:00)
摘要:《数据与算术运算》笔记
转于http://colormoon.programfan.com
1.整数值
整数前面可以带(或不带)正、负号,但不允许带小数点、逗号或其他特殊符号(如美元符号)。
不同的数据类型在不同设备的存储空间是不同的。
要存储超过设备内定存储空间的整数,必须使用整数限定符。
2.浮点数
同整数值一样,浮点数也不允许带小数点、逗号或其他特殊符号。浮点数分为“float”、“double”、“long double”。它们的区别在于存储空间的大小。
浮点数后面加上“F”或“f”表示这是一个单精度浮点数,加上“L”或“l”表示这是一个双精度长浮点数,如果不加后缀则表示是双精度浮点数。
浮点数也可以用指数表示法表示。如1625 可以表示为 1.625e3,即 1.625x103。
3.字符值
A的ASC码值为65,a的ASC码值为97。
4.算术运算
%是取模运算符,该运算结果是取余数。
向输出流中插入数据可以在多个行中完成,以分号为结束。如:
cout<<"The resoult is "
<<(22.5+5)<<endl;
但是包含在双引号里的字符串不能被分解为几行,且只有在最后一行中出现分号。
算术表达式的结果永远也不会是一个单精度浮点数,因为计算时,计算机临时将所有单精度数转换为双精度数。
5.整数的除法
两个整数相除,其结果是一个整数,小数部分被省去。
6.运算符的优越级
运算符 结合性
-------------------------------------------------
--(一元的) &......
排序算法 集中(2006-11-07 17:34:00)
摘要:排序的算法集中到一起了,包括冒泡排序、选择排序、插入排序,Shell排序,快速排序、归并排序、堆排序,基数排序、bucket排序。
使用起来也很简单,包含SortAlgorithm.h即可直接使用(这里重在算法本身,用一个类包含static函数的做法则可以原谅了:)。
(两个文件:SortAlgorithm.h和main.cpp)。
//SortAlgorithm.h
#if !defined _SORT_ALGORITHM_H_
#define _SORT_ALGORITHM_H_
#ifndef NNULL
#define NULL 0L
#endif //~ NULL
#include <cassert>
#include <ctime>
#include <iostream>
using namespace std;
template <typename T>
class BasicSortor
{
public:
// bubble sort
static void bubbleSort( T* _data,int _left,int _right )
{
assert( NULL != _data );
assert( ( _left >= 0 ) && ( _right >= _left ) );
if ( 1 == _right - _left ) return ;
&......
46家公司的笔试题目汇总(2006-11-03 11:40:00)
摘要:46家公司的笔试题目汇总
Sony笔试题
1.完成下列程序
*
*.*.
*..*..*..
*...*...*...*...
*....*....*....*....*....
*.....*.....*.....*.....*.....*.....
*......*......*......*......*......*......*......
*.......*.......*.......*.......*.......*.......*.......*.......
#include <stdio.h>
#define N 8
int main()
{
int i;
int j;
int k;
---------------------------------------------------------
| |
| |
| |
---------------------------------------------------------
return 0;
}
2.完成程序,实现对数组的降序排序
#include <stdio.h>
void sort( );
int main()
{
int array[]={45,56,76,234,1,34,23,2,3}; //数字任//意给出
sort( );
return 0;
}
void sort( )
{
____________________________________
| |
| |
|-----------------------------------------------------|
}
3.费波那其数列,1,1,2,3,5……编写......
VC中OpenGL编程的步骤(2006-11-03 11:29:00)
摘要:VC中OpenGL编程的步骤:
1. 使用AppWizard创建应用程序框架,在文档和视结构中,视负责窗口中内容的显示,因此所有的OpenGL绘制工作应放在视类进行;
2. 利用ClassWizard给视类添加如下成员函数:
重载PreCreateWindow函数;
响应WM_CREATE消息的OnCreate函数;
响应WM_SIZE消息的OnSize函数;
响应WM_ERASEBKGND消息的OnEraseBKgnd函数;
响应WM_DESTROY消息的OnDestroy函数;
重载OnInitialUpdate函数
3. 在PreCreateWindow函数中加入如下语句:
cs.style=cs.style|WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
窗口必须设置以上属性,否则像素格式就不能正确设置;
4. 设置像素格式,创建绘制描述表。这一过程放在响应WM_CREATE消息的OnCreate函数中。WM_CREATE消息窗口被创建时产生。
像素格式(pixelformatdescriptor)定义显示设备的三十特性,比如颜色位平面的数量和组织方式(RGB模式还是索引模式),是否采用双缓存模式等等。OpenGl和GDI(Windows的图形设置接口)的像素格式不同,而Windows应用中窗口的缺省设置是GDI像素格式,所以需要为执行OpenGL绘制任务的窗口专门指定像素格式。对每个窗口,像素格式只能设置一次。
绘制描述表(DC)与设置描述表(RC)类似,但包含了更多有关OpenGL绘制信息。OpenGL依赖绘制描述表操作显示硬件,因此调用OpenGL命令前,必须创建描述表并使其成为当前的绘制描述表。
设置像素格式、创建绘制描述是每个窗口进行OpenGl绘制前必不可少的步骤,所以放在OnCreate函数中最为合适。
5. 响应WM_SIZE消息。当视窗的大小改变时,需发送WM_SIZE消息。在WM_SIZE的消息响应函数中可以获知改变后窗口的大小,因此在其中可以调用glViewport对场景的窗口变换进行更改以后适应窗口大小的改变,还可通过glFrustum等函数重新设置投影变换,使得当窗口的大小发生改变时,显示在窗口中的场景不会发生扭曲。
6.......
C++好网站及其他网站收录(2006-10-22 10:12:00)
摘要: C++好网站及其他网站收录
常用网站:
侯俊杰 (个人程序网站)
http://www.jjhou.com
++ ** 品
Code Project(编程)
http://www.codeproject.com
+ ***
Code Guru(编程PoLtUi)
http://www.codeguru.com
+++ **** 品
VCHELP(vc类copythwa)
http://www.copathway.com
+++ **
中国软件(程序综合4192)
http://www.csdn.net
+++ **
Google(引擎)
http://www.google.com/
++++ ****
Yahoo(引擎)
http://www.yahoo.com.cn
+++ ***
金山在线杀毒
http://www.iduba.net/antiscan/
+++
问专家(编程论坛)
http://www.china-askpro.com
++ ***
IT写作社区(斗牛士)
http://www.donews.com
++ **
51job
http://www.51job.com
++ **
中华英才网 &......
VC问题汇总(2006-10-15 11:53:00)
摘要:
VC
DLL Tutorial For Beginners
微软C/C++ 编译器选项和跨平台开发所需要的编译开关
Visual C++常用数据类型转换详解
发行模式的问题
VC++ 5.0式样的工具条
在状态条上显示当前时间
实现平面工具栏的最简单方法
如何使能和禁止工具条的工具提示
如何设置工具条标题
如何在代码中获取工具条和状态条的指针
在任务栏状态区显示应用程序图标
使用拖放的简单方法
用MFC编制屏幕保护程序
如何编程结束应用程序?如何编程控制windows的重新引导?
增强型的状态条
CRuntimeClass的应用
如何获取应用程序的实例句柄?
如何在程序中获得其他程序的图标?
怎样加载其他的应用程序?
如何自定义消息
如何获取一个对话控件的指针
如何访问预定义的GDI对象
如何获取GDI对象的属性信息
VC1.5 如何调用进程?
VC++1.5编Win3.1程序能否实现全局跳转?
生成自定义的关键字
启动和等待进程结束
获得各种目录信息
Turn Browser Information Off!
Master Your Toolbars
Format Blocks of Code Quickly
Handy Debugger Tips
Get Resourceful with Your Resource Editor
Create Your Own Custom Highlighted Keywords
Release Mode Problems
Get It Online
Remember Code Maintainability
How to change the background color in a single edit control
Speed Up Your VC++ Link Times
确定应用程序的 路径
在用户环境中如何确定系统显示元素的颜色
如何查询和设置系统参数
如何使用一个预定义的Windows光标
如何确定当前屏幕分辨率
如何检索原先的Task Manager应用程序使用的任务列表
如何确定Windows和Windows系统目......