关于指针的简单运算

来源:百度知道 编辑:UC知道 时间:2024/06/08 13:33:09
#include <stdio.h>
void LE(int* a,int* b) {
int x=*a;
*a=*b; *b=x;
}

void main() {
int x=15,y=26;
printf("%d %d\n"),x,y);
LE(&x,&y);
printf("&x,&y);
printf("%d %d\n",x,y);
}

答案是:
15 26
26 15
我不明白的是26 15是怎么得来的。
帮忙解释一下"*"在程序中起什么作用,还有为什么要用&x,&y?
程序打错了,正确的是:
#include <stdio.h>
void LE(int* a,int* b) {
int x=*a;
*a=*b; *b=x;
}

void main() {
int x=15,y=26;
printf("%d %d\n",x,y);
LE(&x,&y);
printf("%d %d\n",x,y);
}

首先给你解释下为什么要用&x,&y吧。
这个就是形式参数和实际参数必须一致的原因。
在你的LE函数中,返回值是void 两个形式参数分别为两个指向int的指针变量。
所以,在你赋予实参的时候,也要是地址类型的变量。
所以, 会用&x,&y,
如果直接用x,y的话,则会出现编译错误。

第二个问题,为什么会变。
#include <stdio.h>
void LE(int* a,int* b) {
int x=*a;
*a=*b; *b=x;
}
在函数里,我们是把地址传送给了函数里面进行处理。
在这个参数里,由于把地址里的东西进行了一下交换,所以,后来的输出就会发生变化。

假如是下面这样的话
void LE(int a,int b) {
int x=a;
a=b; b=x;
} 则函数调用的是数据本身,那么,经过对换后,x和y的值在这这个函数里面,也就是在大括号里面,他们的值发生了变化,但是在外面, 则还是一样的。这里也涉及到一个作用域的问题。

在打个相似的比方吧。

不用指针或者引用的时候,你就象把两个都拿着苹果的人,换了下位置,A拿的还是A的苹果,B拿的还是B的苹果。

使用指针的时候,则产生的变化为, A拿的是B的苹果,B拿的是A的苹果。

这里,A,B两人就相当于地址,而苹果就相当于实际的数据。

传址实现数据的交换

LE(&x,&y); //这里传地址

void LE(int* a,int* b) {
int x=*a; //记录值
*a=*b; //将指向地址内的数据变更
*b=x; //将指向地址内的数据变更
}

代码都写错了:
#include <stdio.h>
void LE(int* a,int* b) {
int x=*a;
*a=*b; *b=x;