C 中关于指针入门的最好的文章

2008-02-23 05:41:34来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折


  什么是指针?

  其实指针就像是其他变量相同,所不同的是一般的变量包含的是实际的真实的数据,而指针是个指示器,他告诉程式在内存的哪块区域能够找到数据。这是个很重要的概念,有很多程式和算法都是围绕指针而设计的,如链表。

  开始学习

  如何定义一个指针呢?就像您定义一个其他变量相同,只但是您要在指针名字前加上一个星号。我们来看一个例子:下面这个程式定义了两个指针,他们都是指向整型数据。

  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始终指着有用的信息,这是因为了动态分配。但是您再仔细读读上面这个程式,虽然他得到了正确结果,可仍有一个严重的错误。

  分配了内存,别忘了回收

  太复杂了,怎么会更有严重的错误!其实要改正并不难。问题是:您动态地分配了一个内存空间,可他绝不会被自动删除。也就是说,这块内存空间会一直存在,直到您告诉电脑您已使用完了。可结果是,您并没有告诉电脑您已不再需要这块内存空间了,所以他会继续占据着内存空间造成浪费,甚至您的程式运行完毕,其他程式运行时他还存在。当这样的问题积累到一定程度,最终将导致系统崩溃。所以这是很重要的,在您用完他以后,请释放他的空间,如:

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 新手学习之浅析一下c/c 中的指针

下一篇: 关于C 代码优化的方法总结(一)