Sign-up....

指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

先说两句题外话.最近,在研读mfc的源代码,研读过程中倍感自己C++的功底不足,既要从mfc的设计上思考,又得从C++的语法上思考,

十分的吃力.虽说是收获不小,但总觉得,不是个办法.因此,现在先放下了mfc来补C++.

  

  关键的问题还是在指针上,自己被感指针功能的强大,并且深刻的意识到学习C/C++不会使用指针是绝对行不通的,因此放下手中的mfc来

做一个指针用法的小结.并希望此次小结能让自己的C++水平上升一个层次.

_____________________________________________

  由于自己还是一个大二的学生(马上大三了),实践经验少之又少,自己的总结多数来自书籍,还有自己少之又少的代码编写过程中.可

能总结了不少错误的原则,还望各位大师帮学生一个忙.指点一二.免的辛辛苦苦总结了半天还把自己误入歧途啊!哈哈哈...

#############################################

小结一.

  把指针变量作为函数参数的用途.

1.用来传递大型对象(避免按值传递时花费在拷贝上的时间).

 这是我的理解:把指向大型对象的指针传入函数体中,意味着函数有了操作该对象的功能.通过该指针操作了一块不属于该函数局部域的内

存块.而花费的开销只是在函数体内分配了该对象指针的空间,传参时只是对对象的指针进行了一下拷贝.因此在时间和空间上都提高了效率

  //该总结来自C++ Primer,

2.用于面向对象编程中,经常把基类指针作为函数的参数,根据不同的对象实例的指针实现多态的操作.

 小生在看mfc原代码的时候,体会相当的深刻,熟悉mfc的类的层次结构的大师应该有很深的体会.整个mfc提供的那么多类,就是通过指针和

继承把一个个不相干的类联系到了一起.最后就出现了Application Framework这样迷人的东西.

3.数组作为函数的参数.

数组作为函数的参数的实质,函数的参数是一个该类型的指针变量。而该指针变量指向数组的首地址。

 所以以下代码的实质是一样的。

 void F( char *pchar );

void F( char buf[] );

这里出现这样的问题。

 在全局域中定义

 main()

{

int a[10];

sizeof(a);//返回的数组单元的长度。

   //所以通过

sizeof(a)/sizeof(a[0]);

//就可以计算出数组的长度。

}

而定义函数

f( int *p )

{

sizeof(p);//计算出的是该指针变量单元的长度

}

因此

main()

{

int a[10];

f(a);//函数内部则不能得到数组的长度,因此难以对数组进行操作

}

因此在编写操作数组的函数中,一般设置两个参数,一般的写发如下.

template<class Type>

void f( Type *p , int size );

 //该终结来自小生的一次实验代码和C++ primer

4.指向函数的指针作为函数的参数

为什么要使用函数指针作为函数的参数。

 我的理解:在一个复杂而又想让他具有通用功能的过程中(函数)中,对参数数据的操作在功能具有一定的相似性,但又有明显的差异和不同

!因此需要使用不同的函数来处理不同的数据,或者处理相同的数据来达到不同的效果!从而支持某函数(过程)的实现。

一个经典的用法是:

编写遍历二叉树的函数。

 遍历只是一个手段,而最终的目的是为了对树内的数据进性行操作!

 所以函数的定义写成这样

 void BinaryTree::inorder( void(*pfn)( node& item ) )

这样只需要编写返回值为void 参数类型为 node&类型的函数就可以对选择遍历操作时对树内结点的操作。方法是把函数指针传入遍历的函数

就可以啦!

5.指向指针的指针作为函数的参数。

这种用法到现在为止小生还没有见过。只是在"谭浩强"的C语言书中见过。但觉得其价值自己提炼不出来。

 这里向各位大师请教,如果有写过这样的函数,请忙小生总结一下。这种类型的函数的用法!

注意:

这里我觉得有一个问题值得注意!

 指针作为函数的参数不一定指向切实的对象。

 因此在函数体内部做这样的检查是必要的,避免发生,难以发现的错误。

 if( p!=NULL )

{

...

}

else

{

//发出警告

}

以上是小生对指针做为函数参数的总结

——————————————————————————————————————————————————————————————

二。返回值是函数指针的函数。

 返回值是函数指针的函数,涉及到复杂的内存管理问题。

 自己更是头大的要命。所以我把这个问题避开。以后做内存管理的总结时在深入。

 在这里我只谈一个mfc框架中普遍的用法。

 通过函数返回的某个类型的指针,当然在mfc初始化的时候这个指针已经指向确切的对象。通过该指针就可以为别的类提供必要的服务。

 例如:mfc中经典的view/document类中

CMyView::OnDraw( CDC* pDC )

{

CMyDoc *pDoc=GetDocument();//这个地方就获得了CMyDocument对象使用权限,这样就可以在OnDraw函数中为之提供服务了。

ASSET_VALID(pDC);

//// TODO: add draw code for native data here

}

 通过这样的方法,就在没有定义在CMyView类内部定义CMyDocument对象的情况下使用了CMyDocument的对象。

 避免了使用组合的方法。当然,通过这样的方法,切实的把两个类的使用融合到了一起,堪称经典。

 在mfc的整个框架中有好多类都是这样指针联系起来协同工作的。

 

 这也是我看mfc代码看不下去的巨大原因!设计太过巧妙。自己指针的功底又不足啊。

——————————————————————————————————————————————————————————————

这就是自己目前阶段的总结。肯定有好多漏洞吧!

还望各位大师给小生一些指点。

小生在这里先谢过了!!

[2729 byte] By [msdn] at [2007-8-14 13:02:47]
# 1 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

第3个,是不是就是那个数组作为参数,数组的大小被改变,变小了的那个问题?

dlyy at 2005-5-11 14:15:25 >
# 2 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

不错, 写得太多了。

然后你该再精练一下,指针就是对象的“句柄”, C++里的引用其实也是一个指针。

这就够了。

你该继续研究多重继承后的指针和虚表结构。

healer_kx at 2005-5-11 14:19:14 >
# 3 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

顶一下,写得很有见地.

我也说一下自己的观点,以指向指针的指针做为函数的参数在大程序时常用到,这样在使用中,函数的参数可以不需要改变,而只需要改变指向的指针的内容即可,增加了灵活性,比较方便.

kingliujian at 2005-5-11 14:32:29 >
# 4 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

CMyDoc *pDoc=GetDocument();//这个地方就获得了CMyDocument对象使用权限,这样就可以在OnDraw函数中为之提供服务了。

搂主理解有误,这个返回的是一个类的实例,而非函数指针

int(*)(int) fun(void*);

这个样子的定义才是返回一个函数指针...

nicknide at 2005-5-11 14:32:38 >
# 5 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

抱歉一个,例子中间,Demo里面那些函数}后面的;多余了,呵呵

nicknide at 2005-5-11 14:42:01 >
# 6 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

>> 5.指向指针的指针作为函数的参数。

主要有两种用途:

其一是将函数中的某个地址值通过指针的指针这个函数参数传递到函数外面使用。在C语言中经常这么用;但是C++中更常用的是指针的引用,在概念上比指针的指针更容易理解。

其二是用指针的指针来传递一个动态分配的二维数组。同样,在C++中用vector等类可以简单地实现,也几乎用不到指针的指针来做。

whyglinux at 2005-5-11 14:48:05 >
# 7 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

回5楼楼主!

以下是msdn对GetDocument的描述

——————————————————————————

CDocument* GetDocument( ) const;

——————————————————————————

楼主说的很对,的确他是返回了个对象实例的指针!

通过该指针就可以对存在于mfc某个角落中生成的CMyDocment对象进行操作。

可能楼主,没理解我的意思,并不是返回一个函数指针。

同时,非常感谢您宝贵的意见,您的代码,看了好久,还不大明白!

奋斗ing....

monk188 at 2005-5-11 16:13:02 >
# 8 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

回8楼楼主!

——————————————————————————————————————————-

指向指针的指针作为函数的参数。

主要有两种用途:

其一是将函数中的某个地址值通过指针的指针这个函数参数传递到函数外面使用

————————————————————————————————————————————

最后这句话好难理解。

函数中的某个地址址?是指一些实例的指针?包括数组指针,对象指针,或者是函数指针?

这个我姑且这么理解。

但什么叫做 把这个参数传递到 函数外使用呢?

monk188 at 2005-5-11 16:20:27 >
# 9 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

忍不住要说的是,MFC太老了, 相当于C和C++的混合体,

在面向对象方面并不是很好。

个人认为研究STL更好些。

rtdb at 2005-5-11 16:25:22 >
# 10 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

但什么叫做 把这个参数传递到 函数外使用呢?

A:

void gc(char** par)

{

char buf[] = "i love C & C++";

*par = (char*)buf;

}

int

main()

{

char* p = 0;

gc(&p);

printf( *p );

return 0;

}

nicknide at 2005-5-11 16:48:41 >
# 11 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

又疏忽了,上面printf里面 应该直接是 p;

还有想说的就是,用MFC来学习C++,绝对是你的一个错误,MFC里面技巧用的最多的是宏,而不是C++

nicknide at 2005-5-11 16:50:26 >
# 12 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

再次更改例子,一直范错误:

void gc(char** par)

{

//char buf[] = "i love C & C++";

static char buf[] = "i love C & C++";//改为静态,否则就引用临时数据,BUG

*par = (char*)buf;

}

int

main()

{

char* p = 0;

gc(&p);

//printf( *p );

printf( p );//手误

return 0;

}

nicknide at 2005-5-11 16:52:44 >
# 13 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

哈哈

我大二还在看毛片呢

赞一个

guyaguya at 2005-5-11 17:10:42 >
# 14 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

看了搂主标题,寒一个,大师指点...

这年头,怕没人敢自称大师吧?

而且大师级人物,给人感觉都是快化成灰的人了......

nicknide at 2005-5-11 17:36:47 >
# 15 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

ding

mostideal at 2005-5-11 20:12:13 >
# 16 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

二维指针来修改一维指针

oyljerry at 2005-5-11 20:50:21 >
# 17 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

偶也大二,看见楼主的帖子,真是汗颜啊,大学这2年过到狗身上去了.........

lingzantia at 2005-5-11 23:13:39 >
# 18 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

UP。学习ING

fzu_893 at 2005-5-11 23:21:27 >
# 19 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

常总结有利进步

neushi at 2005-5-11 23:43:00 >
# 20 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

我觉得指针搞得太复杂很容易造成数据上传递失误,不知道各位遇到过这些问题没有.

我遇到过不少,找错误花了很多时间

august1983 at 2005-5-12 0:35:58 >
# 21 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

看了大家的热心回贴真的好感动!

先谢谢大家!

————————————————————————————————————————————

回:nicknide(封月翔天) 的例子!

看了你的例子,我立刻做了相关的实验。结果正确。

细细分析起来,马上又产生了疑惑。

static 在局部域分配的栈空间(非堆空间)在程序执行完毕是如何回收的

还是系统会帮你把这件事情做好。

上边的例子感觉在一个void的函数中出现了return的效果

————————————————————————————————————————————

monk188 at 2005-5-12 10:30:11 >
# 22 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

不错,mark

limlzm at 2005-5-12 14:25:21 >
# 23 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

这个问题,有点意思

xuelong_zl at 2005-5-12 20:09:51 >
# 24 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

mark

sharpwind at 2005-5-12 21:20:15 >
# 25 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

Q:但是奇怪的问题是该代码,在运行的时候出错!!!

不知道是怎么回事!

还请前辈指点!!!!

A:注意这里,

char **pstr=NULL;

以后指针这里直接写0,NULL是不好的习惯和标准,这样一来就可以看明白了:

char **ptr = 0;

-> char **ptr;ptr = 0;

然后这样:

*ptr = other_ptr;

崩溃是自然的,因为你写了0地址;

因该这样:

char **ptr = new char*;

*ptr = other_ptr;

nicknide at 2005-5-12 22:31:40 >
# 26 Re: 指针问题!!做指针总结时的心得及发现的问题!!各位大师请指点一二!回者有分

啊。。。。。!

看了前辈的解释真是毛色顿开!

现在已经理解了!

因为

**ptr=0;

所以*ptr就是在取一个空地址上的内容。

还要把某地址的址赋值给它,当然是不和逻辑的事情。

明白,明白。

————————————————————————————————————————————

拜谢!

monk188 at 2005-5-13 10:55:43 >

C/C++

All Classified