导航
  • 主页
  • VC综合技术
  • MFC新技术
  • 互联网技术
  • .NET 技术
  • VC/MFC界面
  • VC/MFC 进程
  • VC/MFC 数据库
  • VC++技术资源

关于指针,引用这些概念的一些问题

yurilin 2010-08-02 09:08:44
我平时用的是一些封装性比较好的语言。所以看了VC的一些书,对有些指针也引用方法的用法还是有些找不到规律。

比如有时候定义了一个指针,赋值的时候却有时候用p*=这样赋值,有时候用p=这样赋值。

我看了下发现有时候它们似乎是一样的效果。请问,是不是实用指针的时候有时候可以有两种写法。

另外有时候=&p的时候得到的值又不是地址,有时候是地址(我说书上),所以有点模糊。





还有个问题就是引用。发现很多函数参数声明都市¶m的形式。这样写是为了节省内存开销呢还是必须这么写。具体哪些地方写。


关于函数用指针形式传参数我觉得是不是类似于其他高级oop语言中的传递单例的意图。因为发现c++中很多地方都是
类名* 实例名。是不是这样申明的实例无论多少个,都只占用一个系统开销。




关于函数指针我看到把函数作为指针传递给参数。(而某些oop语言可以直接把函数作为参数),是不是指针形式的函数作为参数就是因为不能直接把函数作为参数。
另外回调这个函数的时候,为什么声明前要加个callback,是不是不加也一样。



有些问题也许我问错了,不过应该可以理解。望大家莫笑指点

...全文
62 点赞 收藏 6
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yurilin 2010-08-03


一个指针定义好了比如叫*p
我看到书上(叫指针的入门书,不是别的复杂代码)

有时候写*p=xx
有时候却直接写p=xx。

不知道是它漏掉了还是都可以一样


还有就是有一次看到一个简单例子返回&p的时候也不是内存地址值,而是数值。
所以就是这觉得比较搞。到底是不是写错了。
回复
xingpacer 2010-08-02
还有个问题就是引用。发现很多函数参数声明都市¶m的形式。这样写是为了节省内存开销呢还是必须这么写。具体哪些地方写。
------------------------
使用引用的好处:
(1)可以节约系统内存资源,比如我要调某个函数以完成某项功能,而此时要传的参数是内部有多组数据的vector列表,这个时候在定义该被调用函数时,我们就可以将函数的形参定义为引用,比如:

void functionA(std::vector<std::string>& stringList);

如果不定义为引用,则在运行到该调用函数的时候,将要执行该vector列表的拷贝,当vector列表中的数据很多时,拷贝既会消耗栈上的内存,也会消耗一定的时间。

(2)当我们要调用没个函数以获取我们想要的数据的时候,可以将存放数据的变量在调用函数之前定义好,在调用函数的时候作为以引用的方式传进去,这样调用函数所获取的结果保存在引用变量中返回给我们。这是你可能会问:为什么不把结果作为函数的返回值返回呢?而要用参数的方式返回呢
--因为有时候,我们还需要知道函数调用的成功与否,可以通过函数的返回值来判断,所以这种情况下函数返回值就“被占用”了。比如我们要调用某个函数接口,获取数据库中的存放设备信息的设备表中的所有设备的信息:

std::vector<DeviceInfo> deviceInfoList; //DeviceInfo是表示设备信息的结构体
int nRet = GetDeviceInfoList(deviceInfoList); //将deviceInfoList作为参数传入,然后用返回值判断数据获取成功与否
.........

//函数声明形式为
int GetDeviceInfoList(std::vector<DeviceInfo>& infoList);


(3) 有一点要注意:当我们定义函数时将函数的返回结果以引用的形式返回,我们在调用该函数时,接收函数的返回值的变量也应该定义为引用,才能真正实现使用引用的目的,比如:

std::vector<DeviceInfo>& GetDeviceInfoList(); //函数的声明

......
std::vector<DeviceInfo>& devInfoList = GetDeviceInfoList(); //函数的调用处,此处接收GetDeviceInfoList()函数返回值的devInfoList变量必须定义为引用

这应用于什么场合呢?当我们在代码中多处使用某个“共享类”(大家都能访问的类)中某个列表变量,该列表变量中包含大量的数据,这时候就可以采用上面说道的方式,来节约系统内存的开销。

回复
wltg2001 2010-08-02
比如有时候定义了一个指针,赋值的时候却有时候用p*=这样赋值,有时候用p=这样赋值。
================
你弄错了,用p*=这样的不是赋值,而是在定义变量时初始化,和赋值不一样的,比如:
CDC *p=GetDC();这个其实是定义指针,同时初始化
如果你写在这样:*p=...这里的*p就不是指针变量了,而是指指针所指的变量,比如:
int *p=&a;
*p=1;
上面的*p=1的作用其实相当于a=1;

另外有时候=&p的时候得到的值又不是地址,有时候是地址(我说书上),所以有点模糊。
======================
&p一般指的就是p的地址,但是&有时候也用作引用的符号,你一定将它们弄混了。

你应该是初学C++,所以有很多地方弄混了,建议去看找一本入门C++书看看。
回复
jxufeng 2010-08-02
你看错书了,指针是C的东西,建议谭浩强 c语言程序设计,大学的基础教科书!
回复
xingpacer 2010-08-02
我平时用的是一些封装性比较好的语言。所以看了VC的一些书,对有些指针也引用方法的用法还是有些找不到规律。

比如有时候定义了一个指针,赋值的时候却有时候用p*=这样赋值,有时候用p=这样赋值。

我看了下发现有时候它们似乎是一样的效果。请问,是不是实用指针的时候有时候可以有两种写法。

另外有时候=&p的时候得到的值又不是地址,有时候是地址(我说书上),所以有点模糊。
----------------------------------------------
(1)与字符串有关的,经常使用指针,调用函数时坐为指针传递;
(2)将类作为函数参数时,一般用都用类的指针,特别是使用多态的时候,定义一个父类的指针,然后将其子类赋给该指针
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……