社区
茶馆
帖子详情
高分求教:传址和传指针问题!
pro_wang
2003-11-03 11:31:40
请问传址和传指针有何区别?
一个数组作为参数,用传址的方式,其格式如何写呢?
...全文
74
6
打赏
收藏
高分求教:传址和传指针问题!
请问传址和传指针有何区别? 一个数组作为参数,用传址的方式,其格式如何写呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
土著巫师
2003-11-03
打赏
举报
回复
1、//int ThisFunctionNeedArrayPara(int ArrayPara[], int iArrayLen)和下面的声明等价
int ThisFunctionNeedArrayPara(int *ArrayPara, int iArrayLen)
{
}
在C/C++里对数组进行操作时,只需传递一个指针就可以了,通常同时附加一个参数,指明数组的维数,反止越界。
2、也可以用STL里的VECTOR实现类似的功能。
3、祝你好运。
hzhxxx
2003-11-03
打赏
举报
回复
void __fastcall TForm1::AyyayParameter(int a[]);
hzhxxx
2003-11-03
打赏
举报
回复
条款22: 尽量用“传引用”而不用“传值”
c语言中,什么都是通过传值来实现的,c++继承了这一传统并将它作为默认方式。除非明确指定,函数的形参总是通过“实参的拷贝”来初始化的,函数的调用者得到的也是函数返回值的拷贝。
正如我在本书的导言中所指出的,“通过值来传递一个对象”的具体含义是由这个对象的类的拷贝构造函数定义的。这使得传值成为一种非常昂贵的操作。例如,看下面这个(只是假想的)类的结构:
class person {
public:
person(); // 为简化,省略参数
//
~person();
...
private:
string name, address;
};
class student: public person {
public:
student(); // 为简化,省略参数
//
~student();
...
private:
string schoolname, schooladdress;
};
现在定义一个简单的函数returnstudent,它取一个student参数(通过值)然后立即返回它(也通过值)。定义完后,调用这个函数:
student returnstudent(student s) { return s; }
student plato; // plato(柏拉图)在
// socrates(苏格拉底)门下学习
returnstudent(plato); // 调用returnstudent
这个看起来无关痛痒的函数调用过程,其内部究竟发生了些什么呢?
简单地说就是:首先,调用了student的拷贝构造函数用以将s初始化为plato;然后再次调用student的拷贝构造函数用以将函数返回值对象初始化为s;接着,s的析构函数被调用;最后,returnstudent返回值对象的析构函数被调用。所以,这个什么也没做的函数的成本是两个student的拷贝构造函数加上两个student析构函数。
但没完,还有!student对象中有两个string对象,所以每次构造一个student对象时必须也要构造两个string对象。student对象还是从person对象继承而来的,所以每次构造一个student对象时也必须构造一个person对象。一个person对象内部有另外两个string对象,所以每个person的构造也必然伴随另两个string的构造。所以,通过值来传递一个student对象最终导致调用了一个student拷贝构造函数,一个person拷贝构造函数,四个string拷贝构造函数。当student对象被摧毁时,每个构造函数对应一个析构函数的调用。所以,通过值来传递一个student对象的最终开销是六个构造函数和六个析构函数。因为returnstudent函数使用了两次传值(一次对参数,一次对返回值),这个函数总共调用了十二个构造函数和十二个析构函数!
在c++编译器的设计者眼里,这是最糟糕的情况。编译器可以用来消除一些对拷贝构造函数的调用(c++标准——见条款50——描述了具体在哪些条件下编译器可以执行这类的优化工作,条款m20给出了例子)。一些编译器也这样做了。但在不是所有编译器都普遍这么做的情况下,一定要对通过值来传递对象所造成的开销有所警惕。
为避免这种潜在的昂贵的开销,就不要通过值来传递对象,而要通过引用:
const student& returnstudent(const student& s)
{ return s; }
这会非常高效:没有构造函数或析构函数被调用,因为没有新的对象被创建。
通过引用来传递参数还有另外一个优点:它避免了所谓的“切割问题(slicing problem)”。当一个派生类的对象作为基类对象被传递时,它(派生类对象)的作为派生类所具有的行为特性会被“切割”掉,从而变成了一个简单的基类对象。这往往不是你所想要的。例如,假设设计这么一套实现图形窗口系统的类:
class window {
public:
string name() const; // 返回窗口名
virtual void display() const; // 绘制窗口内容
};
class windowwithscrollbars: public window {
public:
virtual void display() const;
};
每个window对象都有一个名字,可以通过name函数得到;每个窗口都可以被显示,着可以通过调用display函数实现。display声明为virtual意味着一个简单的window基类对象被显示的方式往往和价格昂贵的windowwithscrollbars对象被显示的方式不同(见条款36,37,m33)。
现在假设写一个函数来打印窗口的名字然后显示这个窗口。下面是一个用错误的方法写出来的函数:
// 一个受“切割问题”困扰的函数
void printnameanddisplay(window w)
{
cout << w.name();
w.display();
}
想象当用一个windowwithscrollbars对象来调用这个函数时将发生什么:
windowwithscrollbars wwsb;
printnameanddisplay(wwsb);
参数w将会作为一个windows对象而被创建(它是通过值来传递的,记得吗?),所有wwsb所具有的作为windowwithscrollbars对象的行为特性都被“切割”掉了。printnameanddisplay内部,w的行为就象是一个类window的对象(因为它本身就是一个window的对象),而不管当初传到函数的对象类型是什么。尤其是,printnameanddisplay内部对display的调用总是window::display,而不是windowwithscrollbars::display。
解决切割问题的方法是通过引用来传递w:
// 一个不受“切割问题”困扰的函数
void printnameanddisplay(const window& w)
{
cout << w.name();
w.display();
}
现在w的行为就和传到函数的真实类型一致了。为了强调w虽然通过引用传递但在函数内部不能修改,就要采纳条款21的建议将它声明为const。
传递引用是个很好的做法,但它会导致自身的复杂性,最大的一个问题就是别名问题,这在条款17进行了讨论。另外,更重要的是,有时不能用引用来传递对象,参见条款23。最后要说的是,引用几乎都是通过指针来实现的,所以通过引用传递对象实际上是传递指针。因此,如果是一个很小的对象——例如int——传值实际上会比传引用更高效。
pp616
2003-11-03
打赏
举报
回复
嘻嘻。
freshman2003
2003-11-03
打赏
举报
回复
根据情况来吧。
jiangchun_xn
2003-11-03
打赏
举报
回复
我习惯穿指针。引用总是不习惯,不知道为什么。。。。
!!!!
高
分
求教
ReadProcessMemory读取内存.有关内存偏移量的
问题
!
!!!!
高
分
求教
ReadProcessMemory读取内存.有关内存偏移量的
问题
! Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiBase/html/delphi_20061207125413246.html 已知一基地
址
$010EA0CC,偏移量为$2A4,先在用ReadProcessMemory函数连读取内存数据,...
指针
变量的
传
值和
传
址
(C++)
在C++编程中,
指针
是一种非常重要的数据类型,它存储了一个变量的内存地
址
。在函数调用过程中,我们可以选择将
指针
传
递给函数,以便在函数内部对
指针
指向的数据进行修改。在C++中,
指针
的
传
递可以通过
传
值或
传
址
的方式进行。通过
指针
的
传
值和
传
址
,我们可以在函数内部修改
指针
所指向的数据,从而实现对变量的修改。
传
值方式会创建
指针
的副本,不会影响到原始
指针
,而
传
址
方式直接
传
递
指针
的地
址
,可以修改原始
指针
。在使用
指针
传
递参数时,需要注意内存的分配和释放,避免内存泄漏或悬挂
指针
的
问题
。在上面的代码中,我们定义了一个。
C++中* (星号) 与取
址
介绍
问题
: C++里的星号是什么意思? 1.不是数学计算里是乘号 2.解释下“用在
指针
前面是取内容运算符”的用法 3.解释下“声明
指针
”的用法 *-*解释清楚上面个
问题
和下面 TTable * tmpTable=FormTableMan->TableTable; 这段代码的为最佳答案!**-** 回答: *一般被称作
指针
运算符,又叫反向取
址
运算
指向数据个人对
指针
的理解,欢迎大家批评Strut2教程-java教程
废话就不多说了,开始。。。
指针
可以懂得成一个用来寄存
址
地和用引指定内存的数据的一个具工。
指针
寻
址
通过
指针
的值即
址
地和
指针
所指向的数据类型可以找到指定内存的数据。 由于
指针
寄存的是内存
址
地,所以可以知道该
址
地,然后根据
指针
的类型,可以找到该
址
地的这块内存,从而可以用引这个内存上的数据,对其停止作操。 每日一道理 “上...
指针
排序(
址
传
递)
/* * Copyright (c) 2013, 烟台大学计算机学院 * All rights reserved. * 作 者: 马广明 * 完成日期:2013 年 12 月 17 日 * 版 本 号:v1.0 * * 输入描述:任意三个数 *
问题
描述:排序(
址
传
递) * 程序输出:由大到小 *
问题
分析:调用函数,
指针
* 算法设计:略 */ #include
茶馆
550
社区成员
20,129
社区内容
发帖
与我相关
我的任务
茶馆
C++ Builder 茶馆
复制链接
扫一扫
分享
社区描述
C++ Builder 茶馆
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章