现在的位置: 首页 > 综合 > 正文

指针使用常见问题的解答与求教系列(1)

2013年10月31日 ⁄ 综合 ⁄ 共 3086字 ⁄ 字号 评论关闭

                               指针使用常见问题的解答与求教系列(1)

    最近做了很多杂七杂八的题目,出错频率最高的就是指针了.学习c++已经很久了,但是现在看来其实对于指针的知识并没有掌握的很好.所以决定好好

的总结下最近所遇到的错误,希望读者能够避免重复犯下笔者遇到的各种错~~!

    例1:解答题
        int main(int argc, char* argv[])
          {
  int a[4]={1,2,3,4};
int *ptr1;
  *ptr1=*(a+1);  
                  //错误是指针并没有指向一个确定的地址.
cout<<*ptr1;
return 0;
 }

   这种情况在初学者身上是经常发生的,就像定义的一样,指针里面存的是一个地址,如果在创建一个指针的时候没有及时给它分配一个确定的地址的话,
那么后面对指针的其他任何操作都将无法进行.so,这里我们需要加一条语句,对ptr1分配一个具体的地址.可以自己new一个地址,也可以在其他操作之前
进行地址分配.即:                    
                
   ptr1=new int;
或者  int *ptr1 =a+1;

     这样,前面的问题也就解决了. 
     ps:读者能猜到
   int *ptr1=(int*)(&a+1);

                cout<<*ptr1;        

             结果是什么吗?.这里面有一个隐藏乘法.

   

    例2:求教题(此题笔者无解,有解的大神不吝赐教!!!)

这是关于建树的一段代码,通过输入的字母进行简单的建树操作.
        测试数据是: ABC  DE F  G   .(空格不可省略).
//////////////////////////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <stdio.h>
using namespace std;

template <class Elem>
class BinNodePtr  {
private:
 Elem it;                     // The node's value
 BinNodePtr* lc;              // Pointer to left child
   BinNodePtr* rc;              // Pointer to right child
public:
   // Two constructors -- with and without initial values
   BinNodePtr() { lc = rc = NULL; }
   BinNodePtr(Elem e, BinNodePtr* l =NULL,
                           BinNodePtr* r =NULL)
    { it = e; lc = l; rc = r; }
  ~BinNodePtr() {}             // Destructor
   Elem& val() { return it; }

 void setVal(const Elem& e) { it = e; }

   inline BinNodePtr<Elem>* left() const { return lc; }

 void setLeft(BinNodePtr<Elem>* b) { lc = b; }

 inline BinNodePtr<Elem>* right() const { return rc; }

           void setRight(BinNodePtr<Elem>* b) { rc = b; }

   bool isLeaf() { return (lc == NULL) && (rc == NULL); }
};

  typedef BinNodePtr<char>* tree;
tree createbintree(tree t)
{
      char ch;
      tree k=NULL;                                                      
      if((ch=getchar())==' ')t=NULL;                                           //终止条件
      else
      {    
         t=new BinNodePtr<char>;                                               //分配地址
         t->setVal(ch);
         t->setLeft(createbintree(k));
        
t->setRight(createbintree(k));
                                     //递归调用

     }
     return t;
}
       void PreOrder(tree t)
   {
      if(t!=NULL)
      {
       cout<<t->val()<<" ";
       PreOrder(t->left());
       PreOrder(t->right());
    }
     else {cout<<" ";return ;}
        }

  
int main(int argc, char *argv[])      //测试
{
   tree t;
     createbintree(t);
   PreOrder(t);
  
     system("PAUSE");
     return EXIT_SUCCESS;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
和例1一样的错误方式,指针导致的内存泄露.但是不同于例题1错误那样简单明了,这段代码在笔者看来是完全可以实现的.
 这就是最纠结的地方了.希望大家有发现错误在哪里能留言联系我!!.下面给出其他方式实现的同样功能作为对比:

/////////////////////////////////////////////////////////////////////////////////////////////////////////
        #include <iostream>
#include <stdio.h>
using namespace std;
struct Node
{
   char data;
   Node *lc;
   Node *rc;
};
typedef Node* tree;
void buildtree(tree *t)
{
   char c;
    if((c=getchar())==' ')*t=NULL;
    else{
    *t=new Node;
    (*t)->data=c;
    buildtree(&((*t)->lc));
          buildtree(&((*t)->rc));

    }
}
       void preOrder(tree root)
       {
   if(root!=NULL)
   {
    cout<<root->data<<"  ";
    preOrder(root->lc);
    preOrder(root->rc);
   }
       }

     int main()
    {
     tree t;
     buildtree(&t);
     preOrder(t);cout<<endl;
    
     system("pause");
     return 0;
   }
///////////////////////////////////////////////////////////////////////
不同的使用方式造成了不一样的结果,指针的错误究竟出在哪里呢  ?

指针的灵活性导致了使用的复杂性,各位读者在使用的时候要细心注意呀~!!

抱歉!评论已关闭.