首页 | 资讯动态 | 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  2007-02-09  oklinux收集整理   会员收藏  游客收藏  【 】 
您查看的文章来源于http://www.oklinux.cn


  什么是指针?
  
  其实指针就像是其它变量一样,所不同的是一般的变量包含的是实际的真实的数据,而指针是一个指示器,它告诉程序在内存的哪块区域可以找到数据。这是一个非常重要的概念,有很多程序和算法都是围绕指针而设计的,如链表。
  
  开始学习
  
  如何定义一个指针呢?就像你定义一个其它变量一样,只不过你要在指针名字前加上一个星号。我们来看一个例子:下面这个程序定义了两个指针,它们都是指向整型数据。
  
  int* pNumberOne;
  int* pNumberTwo;
  
  你注意到在两个变量名前的“p”前缀了吗?这是程序员通常在定义指针时的
  
  一个习惯,以提高便程序的阅读性,表示这是个指针。现在让我们来初始化这两个指针:
  
  pNumberOne = &some_number;
  pNumberTwo = &some_other_number;
  
  &号读作“什么的地址”,它表示返回的是变量在内存中的地址而不是变量本身的值。在这个例子中,pNumberOne 等于some_number的地址,所以现在pNumberOne指向some_number。 如果现在我们在程序中要用到some_number,我们就可以使用pNumberOne。
  
  我们来学习一个例子:
  
  在这个例子中你将学到很多,如果你对指针的概念一点都不了解,我建议你多看几遍这个例子,指针是个很复杂的东西,但你会很快掌握它的。
  
  这个例子用以增强你对上面所介绍内容的了解。它是用C编写的(注:原英文版是用C写的代码,译者重新用C++改写写了所有代码,并在DEV C++ 和VC++中编译通过!)
  
  #include <iostream.h>
  
  void main()
  {
  // 声明变量:
  
  int nNumber;
  int *pPointer;
  
  // 现在给它们赋值:
  
  nNumber = 15;
  pPointer = &nNumber;
  
  //打印出变量nNumber的值:
  
  cout<<"nNumber is equal to :"<< nNumber<<endl;
  
  // 现在通过指针改变nNumber的值:
  
  *pPointer = 25;
  
  //证明nNumber已经被上面的程序改变
  
  //重新打印出nNumber的值:
  
  cout<<"nNumber is equal to :"<<nNumber<<endl;
  }
  
  通读一下这个程序,编译并运行它,务必明白它是怎样工作的。如果你完成了,准备好,开始下一小节。
  
  陷井!
  
  试一下,你能找出下面这段程序的错误吗?
  
  #include <iostream.h>
  
  int *pPointer;
  
  void SomeFunction();
  
  {
  int nNumber;
  nNumber = 25;
  
  //让指针指向nNumber:
  
  pPointer = &nNumber;
  }
  
  void main()
  {
  SomeFunction(); //为pPointer赋值
  
  //为什么这里失败了?为什么没有得到25
  
  cout<<"Value of *pPointer: "<<*pPointer<<endl;
  }
  
  这段程序先调用了SomeFunction函数,创建了个叫nNumber的变量,接着让指针pPointer指向了它。可是问题出在哪儿呢?当函数结束后,nNumber被删掉了,
  
  因为这一个局部变量。局部变量在定义它的函数执行完后都会被系统自动删掉。也就是说当SomeFunction 函数返回主函数main()时,这个变量已经被删掉,但pPointer还指着变量曾经用过的但现在已不属于这个程序的区域。如果你还不明白,你可以再读读这个程序,注意它的局部变量和全局变量,这些概念都非常重要。
  
  但这个问题怎么解决呢?答案是动态分配技术。注意这在C和C++中是不同的。由于大多数程序员都是用C++,所以我用到的是C++中常用的称谓。
  
  动态分配
  
  动态分配是指针的关键技术。它是用来在不必定义变量的情况下分配内存和让指针去指向它们。尽管这么说可能会让你迷惑,其实它真的很简单。下面的代码就是一个为一个整型数据分配内存的例子:
  
  int *pNumber;
  pNumber = new int;
  
  第一行声明一个指针pNumber。第二行为一个整型数据分配一个内存空间,并让pNumber指向这个新内存空间。下面是一个新例,这一次是用double双精型:
  
  double *pDouble;
  pDouble = new double;
  
  这种格式是一个规则,这样写你是不会错的。
  
  但动态分配又和前面的例子有什么不同呢?就是在函数返回或执行完毕时,你分配的这块内存区域是不会被删除的所以我们现在可以用动态分配重写上面的程序:
  
  #include <iostream.h>
  
  int *pPointer;
  
  void SomeFunction()
  {
  
  // 让指针指向一个新的整型
  
  pPointer = new int;
  *pPointer = 25;
  }
  
  void main()
  {
  SomeFunction(); // 为pPointer赋值
  
  cout<<"Value of *pPointer: "<<*pPointer<<endl;
  }
  
  通读这个程序,编译并运行它,务必理解它是怎样工作的。当SomeFunction调用时,它分配了一个内存,并让pPointer指向它。这一次,当函数返回时,新的内存区域被保留下来,所以pPointer始终指着有用的信息,这是因为了动态分配。但是你再仔细读读上面这个程序,虽然它得到了正确结果,可仍有一个严重的错误。
  
  分配了内存,别忘了回收
  
  太复杂了,怎么会还有严重的错误!其实要改正并不难。问题是:你动态地分配了一个内存空间,可它绝不会被自动删除。也就是说,这块内存空间会一直存在,直到你告诉电脑你已经使用完了。可结果是,你并没有告诉电脑你已不再需要这块内存空间了,所以它会继续占据着内存空间造成浪费,甚至你的程序运行完毕,其它程序运行时它还存在。当这样的问题积累到一定程度,最终将导致系统崩溃。所以这是很重要的,在你用完它以后,请释放它的空间,如:
  
  delete pPointer;
  
  这样就差不多了,你不得不小心。在这你终止了一个有效的指针(一个确实指向某个内存的指针)。下面的程序,它不会浪费任何的内存:
  
  #include <iostream.h>
  
  调用时,它分配了一个内存,并让pPointer指向它。这一次,当函数返回时,新的内存区域被保留下来,所以pPointer始终指着有用的信息,这是因为了动态分配。但是你再仔细读读上面这个程序,虽然它得到了正确结果,可仍有一个严重的错误。
  
  分配了内存,别忘了回收
  
  太复杂了,怎么会还有严重的错误!其实要改正并不难。问题是:你动态地分配了一个内存空间,可它绝不会被自动删除。也就是说,这块内存空间会一直存在,直到你告诉电脑你已经使用完了。可结果是,你并没有告诉电脑你已不再需要这块内存空间了,所以它会继续占据着内存空间造成浪费,甚至你的程序运行完毕,其它程序运行时它还存在。当这样的问题积累到一定程度,最终将导致系统崩溃。所以这是很重要的,在你用完它以后,请释放它的空间,如:delete pPointer;
  
  这样就差不多了,你不得不小心。在这你终止了一个有效的指针(一个确实指向某个内存的指针)。
  
  下面的程序,它不会浪费任何的内存:
  
  #include <iostream.h>
  
  int *pPointer;
  
  void SomeFunction()
  {
  
  // 让指针指向一个新的整型
  
  pPointer = new int;
  *pPointer = 25;
  }
  
  void main()
  {
  SomeFunction(); //为pPointer赋值
  
  cout<<"Value of *pPointer: "<<*pPointer<<endl;
  
  delete pPointer;
  }
  
  只有一行与前一个程序不同,但就是这最后一行十分地重要。如果你不删除它,你就会制造一起“内存漏洞”,而让内存逐渐地泄漏。(译者:假如在程序中调用了两次SomeFunction,你又该如何修改这个程序呢?请读者自己思考)
  
  传递指针到函数
  
  传递指针到函数是非常有用的,也很容易掌握。如果我们写一个程序,让一个数加上5,看一看这个程序完整吗?:
  
  #include <iostream.h>
  
  void AddFive(int Number)
  {
  Number = Number + 5;
  }
  
  void main()
  {
  int nMyNumber = 18;
  
  cout<<"My original number is "<<nMyNumber<<endl;
  AddFive(nMyNumber);
  cout<<"My new number is "<<nMyNumber<<endl;
  
  //得到了结果23吗?问题出在哪儿?
  
  }
  
  问题出在函数AddFive里用到的Number是变量nMyNumber的一个副本而传递给函数,而不是变量本身。因此, " Number = Number + 5" 这一行是把变量的副本加了5,而原始的变量在主函数main()里依然没变。试着运行这个程序,自己去体会一下。要解决这个问题,我们就要传递一个指针到函数,所以我们要修改一下函数让它能接受指针:把'void AddFive(int Number)' 改成 'void AddFive(int*Number)' 。下面就是改过的程序,注意函数调用时要用&号,以表示传递的是指针:
  
  #include <iostream.h>
  void AddFive(int* Number)
  {
  *Number = *Number + 5;
  }
  
  void main()
  {
  int nMyNumber = 18;
  
  cout




上一篇:解析Linux下的并口编程(英文版)   下一篇:新手学习之浅析一下c/c++中的指针

收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·解析Linux下的并口编程(英文版)
·新手学习之浅析一下c/c++中的指针
·SourceInsight3.0:Linux源代码阅读
·关于C++代码优化的方法总结(一)
·SMS中用Unicode编码发送中文的办法
·GNUC库----调试系统问题并进行修订
·Linux下C++异常处理技巧-实例讲解
·C++常用字符串处理函数及使用示例
·用C与脚本的混合编程来处理配置文件
·轻松就能让Linux下的C编程从头来
·使用profile来得到程序运行信息
·Linux下C语言编程--时间概念
·在CMP实体BEAN中使用BLOB数据类型
·linux下命令行下编译c程序
·在C/C++中如何构造通用的对象链表
·GCC内嵌汇编之语法详解
发表评论
密码: 匿名评论
评论内容:

(不超过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++字符串转换篇
·初学者编程入门:C 指针使用方法
网摘收藏: