VCer代码 VCer开源 VCer文章 VCer工具 VCer知道 VCer词典 VCer读书 VCer论坛   站点首页 我要张贴 控制面板
VCer代码 VCer开源 VCer文章 VCer工具 VCer知道 VCer词典 VCer读书 VCer论坛   站点首页 我要张贴 控制面板

目前位置: VCer资源中心 >>> VCer文章
子级分类: 软件工程 C++/MFC基础 Windows界面 网络与通信 图形图象处理 系统通信 数据库 文件系统 硬件/系统调用 开发工具 组件技术 其它技术
我来转发一篇文章!>>>


函数指针的使用
 
“在C语言中,函数本身不是变量,但可以定义指向函数的指针,这种指针可以被赋值、存放于数组之中,传递给函数及作为函数的返回值等” --《The C Programming Language Second Edition》下面给出几个简单的例子来说明指向函数的指针。第一个例子说明指向函数的指针如何声明、赋值、调用。#include<stdio.h>#define TESTDATE 100int func(int a){ return printf("%d\n",a);}typedef int (*FuncPtrType)(int a);//函数指针类型的声明int main(){ FuncPtrType fp = 0; //函数指针(变量)的声明以及初始化.等同 int (*fp)(int a) = 0; fp = func; //函数指针的赋值 (*fp)(TESTDATE); //函数指针的调用 return 0;}第2个例子显示如何将指向函数的指针传递给函数、作为函数的返回类型。#include<stdio.h>#define MAX 100int func(int a){ return printf("%d\n",a);}typedef int (*FuncPtrType)(int a);//函数指针类型的 ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1076次,回复0
递归小结
 
递归是一种方法,就是一块代码(通常是函数)直接或间接调用自己,本质上就是向后指令跳转,语法上可以可以用循环语句来实现.要避免无限递归下去,应考虑:1.设置一个停止条件.2.确保函数参数不能重复.直接调用时这种情况不可能人为出现,但是数次递归后要避免出现这种情况. 本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读875次,回复0
this指针小结
 
this不可以被写, 通常用作对象自身的读取,可以省略.有一种情况需要显式使用this指针.当需要对this进行比较操作时, 例子如下void X::copy(const X & obj){ if( this!= obj ) //如果属同一对象,就无需拷贝操作 { ... }}本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1012次,回复0
Thinking in C -- C指针
 
忘记悲伤最好的办法可能就是让自己有事做吧。 因为工作需要,很多好朋友都在重新补最基础也是最重要的C语言。人常说没有学好指针就等于没有学过C,在学校时可能老师只是为了应付考试,而一直在讲那些死板的语法。但对这个C语言(也是任何编程思想)的精髓没有重视。 确实,在几年的编程过程中,感觉对指针的精通可以让我们对任何语言都触类旁通了。语言只是方便我们表达自己思想的助记符,真正的程序在内存中是如何运行的?理解指针可以让你更清楚的知道。 最近在网上看了一些讲解指针的文章,从这些文章中将自己对指针的了解加以整理,我认为基本上如果可以真正理解下面这些,那么你可以对别人说你对C的思想已经精通了。完全精通一门语言当然还要知道它常用的库函数,当然那些就要你自己多编,多记了。/*--------------------------------概念------------------------------------------*/ 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:[1]指针的类型,[2]指针所指向的类型,[3]指针的值或者叫指针所指向的内存区,[4]还有指针本身所占据的内存区。 --sizeof(指针变量名) 一般32位机都为4; 指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时 ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1006次,回复0
c语言的宏
 
关于c语言的宏,我肯定许多人一定有过惨痛的经验。几年前一个典型的错误让我找了一天:#define MACRO_1 5#define MACRO_2 MACRO_1 + 1int a = MACRO_2 * 3;我希望的结果当然是a = 18,可是实际上大家应该都知道a是 5 + 1 * 3 = 8.我以为这样的错误我不会再犯,可是前一阵我还是被一个几乎相同的错误给消耗了一个下午:#define PHY_ADDER 0x400000#define PHY_ADDER_2 PHY_ADDER + 0x100000int *p = (int *)PHY_ADDER_2;指针p的值是多少?0x500000?那只是我想要的结果。p = 0x400000 + 0x100000 * sizeof(int);在我的机器上等于0x800000。你知道为什么吗?指针的加法有这么点特性,如果你知道p++并不意味着p值只加了1你就知道为什么了。 一定要给你的宏加上括号!!本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读975次,回复0
static 用法小结
 
static关键字是C, C++中都存在的关键字, 它主要有三种使用方式, 其中前两种只指在C语言中使用, 第三种在C++中使用(C,C++中具体细微操作不尽相同, 本文以C++为准).(1)局部静态变量(2)外部静态变量/函数(3)静态数据成员/成员函数下面就这三种使用方式及注意事项分别说明一、局部静态变量在C/C++中, 局部变量按照存储形式可分为三种auto, static, register(<C语言程序设计(第二版)>谭浩强, 第174-175页)与auto类型(普通)局部变量相比, static局部变量有三点不同1. 存储空间分配不同auto类型分配在栈上, 属于动态存储类别, 占动态存储区空间, 函数调用结束后自动释放, 而static分配在静态存储区, 在程序整个运行期间都不释放. 两者之间的作用域相同, 但生存期不同.2. static局部变量在所处模块在初次运行时进行初始化工作, 且只操作一次3. 对于局部静态变量, 如果不赋初值, 编译期会自动赋初值0或空字符, 而auto类型的初值是不确定的. (对于C++中的class对象例外, class的对象实例如果不初始化, 则会自动调用默认构造函数, 不管是否是static类型)特点: static局部变量的”记忆性”与生存期的”全局性”所谓”记忆性”是指在两次函数调用时, 在第二次调用进入时, 能保持第一次调用退 ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1231次,回复0
STL之list容器(笔记)
 
容器list,所控制的长度为N的序列是以一个有着N个节点的双向链表来存储的,支持双向迭代器。优势:可以在链表中随意的插入和删除元素或是子链表,所需的仅是改变前后指针。劣势:在定位操作中比如查找和随即存取,时间是线性增加的,而且在存储上每个节点还有前向和后向两个指针。异常:模版类list的另外一个有点是在异常处理方面,对任何容器来说,器成员函数在执行中抛出的异常,使容器本身处于一种一致的状态,可以被销毁,并且容器没有对其所分配的存储空间失去控制。但对大部分操作尤其是那些能够影响多个元素的操作,当抛出异常时,并美欧制定容器的精确状态,但list保证对于大部分成员函数抛出异常时,容器能够恢复到操作前的状态。typedef list<T,allocator<T>> mycont; //使用默认模版参数,可以省略第二个参数构造函数:list() 声明一个空列表;list(al) 声明一个空列表,但她还存储一个分配器对象al;list(n) 声明一个有n个元素的列表,每个元素都是由其默认构造函数T()构造出来的list(n,val) 声明一个由n个元素的列表,每个元素都是由其复制构造函数T(val)得来的list(n,val,al) 声明一个和上面一样的列表,但还存储分配器对象al;list(first,last) 声明一个列表,其元素的初始值来源于由区间所指定的序列中的元素list(firs ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读2087次,回复0
STL之vector容器
 
标准模版类也定义了一个模版类basic_string,basic_string得一个模版参数是元素类型。他们之间得不同之处:basic_string得构造函数和析构函数只能在C程序中声明得类型,可以通过逐位复制得方式来位这样得对象赋值。vector则可以在其中包含任意类型。basic_string参数中需要一个traits类来为它得另一个模版参数,traits指定了如何移动或是比较序列中得元素,并且指定了如何读写由元素构成得文件。vector元素则不能使用这样得traits。basic_string对象可以移交以null结尾得序列,vector对象只理解我们存储在它里面的序列。basic_string对象可以使用写时复制,模版类vector则不行。basic_string对象还提供了一些与字符串处理相关得函数。标准C++库还定义了string是basic_string<char,char_traits<char>>得同义词。 vectro<bool> 模版类vector得特化版本,处理元素类型为bool得序列,可以更加经济得使用内存,将8个元素存储在一个相同得字节空间内,并定义了特殊得flip和swap处理函数; typedef vector<T,allocalor<T>> mycont; 通过使用默认得模版参数,可以省略第二个参数构造函数: vector() 声明一个空得ve ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1524次,回复0
C++精华(STL)学习笔记之算法
 
<algorithm>是STL中最大得一个文件,它是由一大堆模版函数组成得。这些函数包括:max 检测两个元素得较大值min 检测两个元素得较小值swap 交换两个已储存得值iter_swap 交换两个由迭代器描述得值max_element 检测一个序列中较大得值min_element 检测一个序列中较小得值equal 比较两个序列是否相等lexicographical_compare 比较两个序列中一个序列是否排在另一个序列得前面mismatch 检测两个序列中第一个不相等得地方find 检测一个序列中第一个值等于给定值得位置 find_if 检测序列中第一个是pr(x)返回true得元素(pr是一个函数对象)adjacent_find 要检测第一对相等得相邻元素count 要计算一个序列中等于一个给定值得元素得个数count_if 计算一个序列中使ptr(x)返回true得个数得序列search 要在另外一个序列中检测一个序列第一次出现得地方search_n 要在一个序列中检测第一个连续出现n次指定值得地方find_end 要在另外一个序列中检测一个序列最后一次出现得地方find_first_of 要在一个序列中检测另一个序列中任意一个元素第一次出现得地方for_each 使用函数对象OP对序列中得每个元素都调用一次op(x)generate 要使用函数对象fun,将每个元素都 ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1270次,回复0
char* a = "zhf"; 和 char a[] = "zhf"; 之间的区别
 
char* a = "zhf"; 定义一个 指针 a,指向一个 常量字符串 "zhf" 的首地址,由于 "zhf" 是一个常量字符串, 在常量区,无法修改,所以 a[1] = 'k' 出错,它意图修改常量;但是 a 这个指针本身是可以修改的。char a[] = "zhf"; 定义一个 char 数组,该数组的内容是 "zhf", 这里有一个赋值,"zhf" 被赋值给了这个数组, 数组中的值是可以修改的,也就是 a[1] = 'k' 是允许的;但是 数组名 是const 属性的, 不能修改。--------------------char *a[]="aaaaaaa";char *b="bbbbbbb"; aaaaaaaaaaa是在运行时刻赋值的; 而bbbbbbbbbbb是在编译时就确定的; 但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。 对应的汇编代码 10:a=c[1]; 004010678A4DF1movcl,byteptr[ebp-0Fh] 0040106A884DFCmovbyteptr[ebp-4],cl 11:a=p[1]; 0040106D8B55ECmovedx,dwordptr[ebp-14h] 004010708A4201moval,byteptr[edx+1] 004010738845FCmovbyteptr[ebp-4],al ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读983次,回复0
多态性——vptr和vtable
 
多态性 (polymorphism) 是面向对象编程的基本特征之一。而在C++ 中,多态性通过虚函数 (virtual function) 来实现。我们来看一段简单的代码:  #include <iostream>  using namespace std;  class Base  {  int a;  public:  virtual void fun1() {cout<<"Base::fun1()"<<endl;}  virtual void fun2() {cout<<"Base::fun2()"<<endl;}  virtual void fun3() {cout<<"Base::fun3()"<<endl;}  };  class A:public Base  {  int a;  public:  void fun1() {cout<<"A::fun1()"<<endl;}  void fun2() {cout<<"A::fun2()"<<endl;}  };  void foo (Base& obj)  {  obj.fun1();  obj.fun2();  obj.fun3();  }  int main()  {  Base b;  A a;  foo(b);  foo(a);  }  运行结果为:  Base::fun1()  Base::fun2()  B ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读977次,回复0
inline函数的小结
 
C89不支持内联函数,C99才支持。 由于inline函数具有内部链接,因此数个文件定义相同名字的内联函数不会发生冲突,而类函数宏就不行,会产生重复定义。 inline函数是真正的函数,可以由语句组成;但函数宏所做的只是替换,不是真正的函数,当然也不能有语句。函数中的语句大于8句以上的话,一般编译器就自动将你的inline函数转化为uninline函数。宏是把那个代码在当前位置展开,根本不用测试,肯定是最快的。 内联函数编译之后应该是把代码直接插到调用位置(应该是指编译器不优化情况下)所以执行的时候不会去压栈,调用函数代码,退栈,所以如果执行的次数多,就会比较快。 执行到非内联函数时,函数不在当前位置,是个指针,然后经历压栈,调用函数代码,退栈三个过程。会比较慢。inline的引入大部分是为了参数类型安全检查和防止边界效应。如果是函数宏,可能有边界效应。本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1147次,回复0
一点总结
 
1. 指针在函数中调用malloc()分配的内存是放在数据区(堆中)而非堆栈区,所以当退出函数时,该内存依旧存在,只能通过free()释放它,而那些通过结构定义的的结构体(例如:struct msginfo buf),并且在函数体中做了初始化的,这个buf所代表的内存是放在堆栈中的,退出函数后就被释放了。2. const 指针和指向 const的指针(1) 指向 const的指针例如: const int *x , 表示x是一个指针,它指向一个const int,这里不需要初始化,因为x可以指向任何东西,但它指向的东西不能被改变(也就是说x的内容不能变),int const * x与上面的定义是一样的(2 ) const指针例如: int d=1int* const x=&d这样就使该x指针变为了一个const指针,这个指针必须要有初始值,并且该指针在其寿命期间是不能改变的,但其所指向的内容可以改变,比如*x=33.指针和数组名的区别:(1) 指针是个变量,它可以任意赋值,而数组名却不能赋值(2) 对数组中内容的访问可以通过以下的方式进行:int a[3]={4,5,6};int I=0;I=*(a+2)而这样是错误的:I=*(a++);这是因为a++等价于a=a+1,前面说了数组名是不能赋值的a本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读818次,回复0
设计模式之 Singleton
 
/********************************************************************************* File Name : Singleton.h** EMail Addr : seakingw@163.com** * Description : interface for the CSingleton class.* ********************************************************************************/#ifndef _SINGLETONE_PATTERNS#define _SINGLETONE_PATTERNSclass CSingleton{public: static CSingleton* Instance();protected: CSingleton();private: static CSingleton* _instance;};#endif /********************************************************************************* File Name : Singleton.cpp** EMail Addr : ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读958次,回复0
设计模式之 Command 模式
 
/********************************************************************************* File Name : Command.h** EMail Addr : seakingw@163.com** Description : interface for the CCommand class.* ********************************************************************************/#ifndef _COMMOND_PATTERNS#define _COMMOND_PATTERNS#include <list>class CCommand;typedef std::list<CCommand *> CommandList;typedef CommandList::iterator CommandListIt;typedef CommandList::reverse_iterator CommandListReIt;class CCommand{public: virtual ~CCommand(); virtual void Execute() = 0; virtual void UnExecute() = 0 ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1011次,回复0
什么是数组名?----一个让你吃惊的事实!
 
数组是指针的基础,多数人就是从数组的学习开始指针的旅程的。下面我节选一些在各种论坛和文章里经常见到的关于数组的文字:“一维数组是一级指针”“二维数组是二级指针”“数组名可以作为指针使用”“数组名就是..........的常量指针”“数组名就是..........的指针常量”..................................这些文字看起来非常熟悉吧?类似的文字还有许多,或许你就是经常说这些话的人呢。不过非常遗憾,这些文字都是错误的,实际上数组名永远都不会是指针!这个结论也许会让你震惊,但它的确是事实。数组名、指针、地址这几个概念虽然是基础中的基础,但它们恰恰是被混淆和滥用得最多的概念,把数组名说成指针,是一个概念性的错误,实质是混淆了指针与地址两个概念的本质。俗话说得好:浅水淹死人。因此,在讨论数组之前,有必要先回过头来澄清一下什么是指针,什么是地址,什么是数组名。 指针是C语言具有低级语言特征的最直接的证据。在汇编语言里面,指针的概念随处可见。比如SP,SP寄存器又叫堆栈指针,它的值是地址,由于SP保存的是地址,并且SP的值是不断变化的,因此可以看作一个变量,而且是一个地址变量。地址也是C语言指针的值,C语言的指针跟SP这样的寄存器虽然不完全一样,但原理却是相通的。C语言的指针也是一种地址变量,C89明确规定,指针是一个保存对象地址的变量。这里要注 ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1130次,回复0
经典C语言面试题
 
1.从文件中读取数值(大约有10000个数据)计算他们的平均值。要求程序执行速度最快;2.计算打印一个二叉树所用的时间复杂度。3.从文件中随即提取一个字符串,只能扫描文件一次,且不能用表格存储所有字符串在文件中的偏移。4.如何检测链表是否带有循环。5.编写代码确定一个变量是有符号数还是无符号数。6.文件描述符和文件指针有何区别。7.库函数和系统调用有何区别。8.数组和指针这两种类型有何区别。9.静态库和动态库有何区别。10.总线错误(bus error)和断错误(segment fault)有何区别。11.typedef int x[10]和#define x int[10]的区别。12.linux中的信号是什么。13.linux中的线程和进程有何区别。本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1399次,回复0
轻轻松松穿透防火墙
 
如今采用局域网方式接入Internet已经是各个公司、高校和政府机关的主要上网方式,这种方式既节省IP地址,又方便管理和控制。通常网管会在局域网的出口处设置各种防火墙,这样一方面保证了局域网内部的安全xx,另一方面又可以控制局域网内部人员的访问权限。可这样也限制了使用者的使用权限,与外界的联系也很不方便。比方说对于在公司里上班的上班一族和局域网里的穷学生来说,最痛恨的事情莫过于可恨的Boss为了防止大家偷懒而关闭了大多数端口,只允许使用有限的服务,如WWW、POP3、SMTP等。这样就用不成很多工具,如QQ、Cterm、FTP等,你和外界的联系会很不方便,有MM而不能聊、有BBS而不能灌、有精彩的歌曲而不能Down,人世间最大的痛苦莫过于此……怎么办?别急别急,本文教你几招,轻轻松松穿透防火墙,尽情使用各种工具!好,下面我们一起来看这几招的原理解说和实战说明。 名次解释:  协议 协议(Protocol)就是一组在网络上发送信息的规则和约定。这些规则控制在网络设备间交换消息的内容、格式、定时、顺序和错误,通俗说就是不同网络程序的交流语言。我们常见的QQ使用UDP协议、ICQ使用TCP协议、E-mail程序使用POP3和SMTP协议,而在常见的协议中SOCKS是一种比较复杂的协议。  端口 端口(Port)可以认为是计算机与外界通讯交流的出口。其中硬件领域的 ...
作者:不祥 bluejoe张贴于2004-05-26 18:12:19.0,共阅读4008次,回复1
C++类机制的实现细节
 
为了搞清楚VC中类的实现专门写了一个最简单的类,用来观察它的实现过程,代码如下:   // test.cpp : Defines the entry point for the console application.   //      #include "stdafx.h"   #include "CTest.h"        int main(int argc, char* argv[])   {   CTest aTest;   aTest.a(1,2);   return 0;   }      // CTest.h: interface for the CTest class.   //   //////////////////////////////////////////////////////////////////////      #if !defined(AFX_CTEST_H__2CCCDCFC_6C3A_48BC_9CD0_E7A8E63431D9__INCLUDED_)   #define AFX_CTEST_H__2CCCDCFC_6C3A_48BC_9CD0_E7A8E63431D9__INCLUDED_      #if _MSC_VER > 1000   #pr ...
作者:不祥 try_yuyi张贴于2004-07-24 19:16:27.0,共阅读2961次,回复2
面向对象的分析技术
 
作者:不祥 zqdkq张贴于2004-09-16 10:40:05.0,共阅读2032次,回复0

页次: 7/10页 记录总数185 9 7 [ 1 2 3 4 5 6 7 8 9 10 ] 8 :