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

                               指针使用常见问题的解答与求教系列(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;
   }
///
不同的使用方式造成了不一样的结果,指针的错误究竟出在哪里呢  ?


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值