首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | HR | 镜像
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
搜索中心 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>cc++>正文

初学者编程入门:C 指针使用方法

http://www.oklinux.cn  2008-03-07  C 学习资源网 C 学习资源网  会员收藏  游客收藏  【 】 
您查看的文章来源于http://www.oklinux.cn

在下列函数声明中,为什么要同时使用*和&符号?以及什么场合使用这种声明方式?











void func1( MYCLASS *&pBuildingElement );
 

经常会有人问到这样的问题。本文试图通过一些实际的指针使用经验来解释这个问题。仔细看一下这种声明方式,确实有点让人迷惑。在某种意义上,"*"和"&"是意思相对的两个东西,把它们放在一起有什么意义呢?

为了理解指针的这种做法,我们先复习一下C/C 编程中无所不在的指针概念。我们都知道MYCLASS*的意思:指向某个对象的指针,此对象的类型为MYCLASS。

void func1(MYCLASS *pMyClass);   
// 例如: MYCLASS* p = new MYCLASS; 
func1(p);

上面这段代码的这种处理方法想必谁都用过,创建一个MYCLASS对象,然后将它传入func1函数。现在假设此函数要修改pMyClass:

void func1(MYCLASS *pMyClass) 
{ 
DoSomething(pMyClass); 
pMyClass =
// 其它对象的指针 
} 

第二条语句在函数过程中只修改了pMyClass的值。并没有修改调用者的变量p的值。如果p指向某个位于地址0x008a00的对象,当func1返回时,它仍然指向这个特定的对象。(除非func1有bug将堆弄乱了,完全有这种可能。)

现在假设你想要在func1中修改p的值。这是你的权利。调用者传入一个指针,然后函数给这个指针赋值。以往一般都是传双指针,即指针的指针,例如,CMyClass**。

MYCLASS* p = NULL; 
func1(&p); 
void func1(MYCLASS** pMyClass); 
{ 
*pMyClass = new MYCLASS; 
   …… 
   }  

调用func1之后,p指向新的对象。在COM编程中,你到处都会碰到这样的用法--例如在查询对象接口的QueryInterface函数中:

interface ISomeInterface
{ 
HRESULT QueryInterface(IID &iid, void** ppvObj); 
   …… 
   }; 
   LPSOMEINTERFACE p=NULL; 
   pOb->QueryInterface(IID_SOMEINTERFACE, &p); 

此处,p是SOMEINTERFACE类型的指针,所以&p便是指针的指针,在QueryInterface返回的时候,如果调用成功,则变量p包含一个指向新的接口的指针。

如果你理解指针的指针,那么你肯定就理解指针引用,因为它们完全是一回事。如果你象下面这样声明函数:

void func1(MYCLASS *&pMyClass); 
   { 
   pMyClass = new MYCLASS; 
   …… 
   }

其实,它和前面所讲得指针的指针例子是一码事,只是语法有所不同。传递的时候不用传p的地址&p,而是直接传p本身:  

MYCLASS* p = NULL; 
   func1(p); 

在调用之后,p指向一个新的对象。一般来讲,引用的原理或多或少就象一个指针,从语法上看它就是一个普通变量。所以只要你碰到*&,就应该想到**。也就是说这个函数修改或可能修改调用者的指针,而调用者象普通变量一样传递这个指针,不使用地址操作符&。至于说什么场合要使用这种方法,我会说,极少。MFC在其集合类中用到了它--例如,CObList,它是一个CObjects指针列表。

              
共2页: 上一页 1 [2] 下一页

上一篇:初学者编程入门:C 实用技巧讲解   下一篇:初学者编程入门:C语言指针使用方法

收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·初学者编程入门:C语言指针使用方法
·初学者编程入门:C 实用技巧讲解
·初学者编程入门:学习C 的最大难度
·感触C语言中的面向对象思想
·细述C/C 字符指针数组及指向指针的含义
·编程秘籍篇:C语言高效编程的四大绝招
·怎样使用Eclipse平台调试您的软件项目
·初学者必备:教你理解复杂的C/C 声明
·讲解如何在C/C 中调用Java的方法
·如何用PHP实现通过Web执行C/C 程序
·与C/C 指针相似的C#代表元及事件触发
·如何在Linux桌面上搭建C/C IDE开发环境
·从C 到Java——理解面向对象的关键所在
·深入理解C语言指针奥秘系列文章之二
·Windows下C语言网络编程快速入门
·深入浅出VA函数的使用技巧
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Turbo C 2.0 认识
·用Eclipse平台进行C/C 开发
·在 Linux 中使用共享对象
·VS:针对Java开发人员的C#编程语言
·使用智能设备扩展在C#中开发自定义控件
·Visual C# 常见问题
·二级C语言实例解答
·一种被忽视的构造和整数溢出重现
·轻轻松松C to C
·与用于 C 的ISO标准保持一致
·用C 的托管扩展针对Windows编程
·运行时和编译时的安全性检查
  阅读排行
·c/c++ 学习-read 函数和 write 函数
·c/c++ 学习-open 函数
·使用 GDB 调试多进程程序
·用Win-TC编译与用TC2.0编译的差异
·细述C/C 字符指针数组及指向指针的含
·感触C语言中的面向对象思想
·C语言程序源代码下载
·Linux下C开发环境的构成与安装
·用Eclipse平台进行C/C 开发
·GCC内嵌汇编之语法详解
·C调用Tcl脚本
·Linux下的多进程编程
·TServerSocket和TClientSocket的使用
·C++字符串转换篇
·例解用 VC 6.0 实现 JNI
网摘收藏: