指针使用常见问题的解答与求教系列(1)
最近做了很多杂七杂八的题目,出错频率最高的就是指针了.学习c++已经很久了,但是现在看来其实对于指针的知识并没有掌握的很好.所以决定好好
的总结下最近所遇到的错误,希望读者能够避免重复犯下笔者遇到的各种错~~!
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;
}
///
不同的使用方式造成了不一样的结果,指针的错误究竟出在哪里呢 ?
指针的 灵活性导致了使用的 复杂性,各位读者在使用的时候要细心注意呀~!!