A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 星河鹭起 中级黑马   /  2014-4-28 10:53  /  1877 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

#include <stdio.h>

void test(int &a,int &b)
{
        a=1;
        b=2;
        printf("a=%d,b=%d\n",a,b);//输出1,2
       
}

int main()
{
        int n=19,m=10;
        test(n,m);
        printf("n=%d,m=%d\n",n,m);//输出1,2
}

函数如上,按照视频的说法,test中应该是用的是地址,为什么我调用时,不使用地址一样可以,求大神帮忙解释解释。。



评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

11 个回复

倒序浏览
test(n,m)调用的就是n和m的地址,和void test(int* a,int* b);
test(&n,&m);
一个意思;
回复 使用道具 举报
胡铭 发表于 2014-4-28 11:13
test(n,m)调用的就是n和m的地址,和void test(int* a,int* b);
test(&n,&m);
一个意思;

不是的把,调用地址应该是test(&n,&m)  这样才是地址调用的吧 。。。
回复 使用道具 举报
本帖最后由 兰闻天 于 2014-4-28 11:46 编辑

视频上说的函数调用地址是指传递数组的时候,基本类型int,char等函数调用可以不调用地址,而是直接调用值。
使用调用地址的时候,test()里修改了形参,会相应修改实参;而直接调用值的话,不会影响实参。
回复 使用道具 举报
实际变量名就是地址。
回复 使用道具 举报
星河鹭起 发表于 2014-4-28 11:28
不是的把,调用地址应该是test(&n,&m)  这样才是地址调用的吧 。。。

首先,你这种void test(int &a, int &b)的写法不是c语言的写法。这个&a和&b也不是取地址的意思。他们是c++中的引用 。其中两个形参a,b是(int &)类型(即引用类型)的而不是取地址,跟地址没什么关系。test(m,n)是c++中的引用传值问题。关于引用你可以理解成给变量起别名(实现细节就不说了)。test(n,m)就表示你给n起了个别名a.给m起了个别名b。所以在函数中a,b的改变的同时n,m也改变。你使用&n,&m反而不对了。
回复 使用道具 举报
gaoxinglei123 发表于 2014-4-28 12:01
首先,你这种void test(int &a, int &b)的写法不是c语言的写法。这个&a和&b也不是取地址的意思。他们是c++ ...

同学,应该不是这样的吧 。&在C语言中有两个作用,第一个作用是与运算,第二个作用就是取地址运算。而且视频中说了,是取其指定变量的地址啊。怎么&n和&m又不对了呢?&n应该就是取变量n的地址吧
回复 使用道具 举报
我的编译器报错了
回复 使用道具 举报
星河鹭起 发表于 2014-4-28 12:41
同学,应该不是这样的吧 。&在C语言中有两个作用,第一个作用是与运算,第二个作用就是取地址运算。而且 ...

声明语句中的&和int m=1;int *p; p=&m中的&是完全不一样的。这里的&和int *p中的*是一样的。只是个标识,为了说明变量的类型。
回复 使用道具 举报
你什么编译器,我的编译器也报错了,c语言中没有普通变量变量名就是变量地址啊 。
回复 使用道具 举报
你的程序有点"非主流"。。。。确实不好理解。。。语法好像就不对。。好像不符合C语言语法看下图

QQ20140428-1@2x.jpg (149.44 KB, 下载次数: 22)

QQ20140428-1@2x.jpg
回复 使用道具 举报
脸皮猴 发表于 2014-4-28 16:06
你的程序有点"非主流"。。。。确实不好理解。。。语法好像就不对。。好像不符合C语言语法看下图
...

我用的是VC++6.0,看来是编译器问题,唉
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马