回 帖 发 新 帖 刷新版面

主题:理解传值和传址

说一下我理解的传值和传址
函数调用时使用啦一个临时的stack,他把函数名,参数表,返回值
按右向左压入栈中当函数结束活动栈死掉
参数传递是用实参的值初始化函数参数栈
传值方法:

int func(int k)
{
函数处理是它的本地拷贝值并不改变实参
k=k+10;
//
rerurn k;
}
void main(void)
{
int c,b,a=10;
b=func(a);//结果b=20;
c=a;//c=10;

return 0;
}

传址方法1:

int func(int *k)
{
函数处理是它的本地拷贝地址并改变实参
*k=*k+10;
//
rerurn *k;
}
void main(void)
{
int c,b,a=10;
b=func(&a);//结果b=20;
c=a;//c=20;

return 0;
}
传址方法2:
int func(int &k)
{
函数处理是它的本地拷贝地址并改变实参
k=k+10;
//
rerurn *k;
}
void main(void)
{
int c,b,a=10;
b=func(a);//结果b=20;
c=a;//c=20;

return 0;
}
传址用于附加返回值(改变实参值)
另一个用于传递大的类型如数组,类对象
防止本地拷贝占用大量内存,降低效率
要传递数组,类对象但又不想改变他们
的值
可以这样定义
int func(const int* a)
int func(const int& a)


望大虾指教


回复列表 (共4个回复)

沙发

针对你的这个说法提出不同意见:
传址方法1:
int func(int *k)
{
函数处理是它的本地拷贝地址并改变实参
/*================================================
要知道,这里谁是实参,谁是形参?
实参是main函数中的&a,不是a.
形参这里是k,不是(*k).
程序的作用是改变(*k),即a,不是k,因为k的值就
是&a,&a是不可以被改变的,所以不是改变实参,而
是改变了实参作为地址的内容。
==================================================*/
    *k=*k+10;
    rerurn *k;
/*
这里的返回值是没有必要的,否则只会浪费资源。
*/
}
void main(void)
{
    int c,b,a=10;
    b=func(&a);//结果b=20;
    c=a;//c=20;
    return 0;
}

板凳

说得好这是有误
int func(int *k)
{
函数处理是它的本地拷贝地址并改变实参
_____________应是
函数处理是它的本地拷贝地址并改变的其所指向(或引用)地值
而传值不能改变其值
  rerurn *k;
----------------
这只是用于显示是没用表达不清
谢谢,谢谢

3 楼

看帖回帖,
从小事做起

4 楼

int func(int* k)

个人认为这样写就好理解了,k本身(注意不是*k)还是在栈中,但是改变*k应该很容易的想到是改变了某个地址的值

我来回复

您尚未登录,请登录后再回复。点此登录或注册