传地址和传值的问题

gesanri 2008-09-06 09:10:10
#include "stdio.h"
#include "conio.h"

#define swap(x,y){ \
int t; \
t=x; \
x=y; \
y=t; \
}
main()
{
int a,b;
a=5,b=9;
swap(a,b);
printf("%d,%d",a,b);
getch();
}
以上程序在wintc中运行结果为:9,5,而下面的程序结果却为:5,9,请问为什么,另外上面的程序的5个"\"是干什么用的?

#include "stdio.h"
#include "conio.h"

void swap(int x,int y){
int t;
t=x;
x=y;
y=t;
}
main()
{
int a,b;
a=5,b=9;
swap(a,b);
printf("%d,%d",a,b);
getch();
}
...全文
131 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiongwangmxf 2008-09-08
  • 打赏
  • 举报
回复
哈哈。。多看两遍教程
steven_well 2008-09-06
  • 打赏
  • 举报
回复
你写的第一个程序,其中包含“\”,是不是出错了啦!我用的是VC 6.0编译器。
结果报错了!在VC里该这样:
#include <iostream>
using namespace std;//two lines of above must be inside!otherwise,mistake will be happened.

#include "stdio.h"
#include "conio.h"

#define swap(x, y){ int t; t=x; x=y; y=t; }//这行应该这样写才行,至于你的那种,在VC里面根本就行,
//那就不用说为何要用“\”这个了。这里是宏定义,一般都这样写的.

void main()
{
int a,b;
a=5,b=9;
swap(a,b);
printf("%d,%d",a,b);
getch(); //what is it used? sorry ,i dont know
}
当然你的第二个程序也应该在前面加上:
#include <iostream>
using namespace std;
以上就是,在VC里面的出错情况!
至于,第一个程序为何,结果值达到了交换的效果;而第二个程序却无法!先讲第二个吧!
在这里“void swap(int x,int y)”你传的只是a和b的值过来,在swap(int x,int y)函数里,更本就不能改变a和b各自地址里所存放的内容。如果要改的话,很简单:其一,void swap(int x,int y)改成void swap(int &x,int& y);或者是直接将a和b个自得地址传过来,在改写一下swap函数。前者是用引用,后者用指针;
接下来,在说第一个为何能完成交换。用#define swap(x, y){ int t; t=x; x=y; y=t; }进行宏定义,实质只是进行字符替换,替换后的程序就相当于这样了:
#include "stdio.h"
#include "conio.h"

void main()
{
int a,b;
a=5,b=9;

int t; t=a; a=b; b=t;//swap(a,b);

printf("%d,%d",a,b);
getch();
}
因此能够完成交换!
rivulettornado 2008-09-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Arthur_ 的回复:]
第一个是宏, 宏的基本概念就把你写的代码扩展到你调用的地方于是它等价于
main()
{
    int a,b;
    a=5,b=9;
    {int t;             
    t=x;                 
    x=y;                   
    y=t; }
    printf("%d,%d",a,b);
    getch();
}
其中\是换行符号, 不加也没有关系(看编译器识别了)

第2个是函数, 当调用函数时候是把a和b的值传给了函数, 在函数里面对不能改变原来ab的直。
它等价与
a…
[/Quote]

对了,想起来宏的作用了,看起来我刚才的说法是有很多的错误了。sorry啊
rivulettornado 2008-09-06
  • 打赏
  • 举报
回复
前者是C语言中的宏函数,不是我们通常使用的自定义函数,因为没有看到权威的说明,我只能猜测一下,我认为宏函数的地址空间是在预定义时就固定下来了的,就是说调用宏函数的时候,使用的是这一部分地址空间,当函数调用结束之后,这一部分空间还是由宏函数保留着的,所以在宏函数中的变量赋值之后,内存中的值就是固定的了,除非重新赋值。所以按照我的理解,第一个程序中的交换的过程真的就是将两个参数的值在内存中进行了交换,所以出现了交换的结果(这种结果类似于引用的操作),第二个程序就不用多说了,实参形参的问题了。
_石头_ 2008-09-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 akirya 的回复:]
\是续行符号
上面是宏,会展开成.
main()
{
int a,b;
a=5,b=9;
{
int t;                    \
t=a;                      \
a=b;                        \
b=t;                        \
}
printf("%d,%d",a,b);
getch();
}
支持,#define 仅仅只是宏替换,不会造成函数调用的,在编译的时候就会按照#define的格式将代码中的内容体换掉,所以第一个事列中没有swap函数,它仅仅只是个宏而已
[/Quote]
饽饽 2008-09-06
  • 打赏
  • 举报
回复

上面的是宏定义,不分配内存,直接在程序运行时替换到程序的代码块当中
下面的是函数调用,此时函数的形参与实参在不同的内存当中,当函数调用结束,形参的内存就被释放了
jieao111 2008-09-06
  • 打赏
  • 举报
回复
首先,你要分清传地址,和传值。。关于这个的讨论,你的c语言书应该很详细。你的程序只有一个传值的,另一个是宏,编译期替代的


Arthur_ 2008-09-06
  • 打赏
  • 举报
回复
第一个是宏, 宏的基本概念就把你写的代码扩展到你调用的地方于是它等价于
main()
{
int a,b;
a=5,b=9;
{int t;
t=x;
x=y;
y=t; }
printf("%d,%d",a,b);
getch();
}
其中\是换行符号, 不加也没有关系(看编译器识别了)

第2个是函数, 当调用函数时候是把a和b的值传给了函数, 在函数里面对不能改变原来ab的直。
它等价与
a= 1
__a = a;
__a =2;
但a还是1, 这就是值传递的类似结果
  • 打赏
  • 举报
回复
至于函数,你在函数体内交换的是两个副本,不会对原来的ab有影响的
jieao111 2008-09-06
  • 打赏
  • 举报
回复
上面是宏,下面是函数。
/表示是,是连起来的,分行写美观
  • 打赏
  • 举报
回复
\是续行符号
上面是宏,会展开成.
main()
{
int a,b;
a=5,b=9;
{
int t; \
t=a; \
a=b; \
b=t; \
}
printf("%d,%d",a,b);
getch();
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧