指针的问题,谁能帮我解答一下为什么。C语言系列

来源:百度知道 编辑:UC知道 时间:2024/05/25 04:25:09
#include <stdio.h>
swap(int *p1,int *p2)
{
int temp;
*temp=*p1;
*p1=*p2;
*p2=temp;
}
main()
{
int a,b;
int *pointer_1,*pointer_2;
scanf("%d,%d",&a,&b);
pointer_1=&a;
pointer_2=&b;
if (a<b)
{
swap(pointer_1,pointer_2);
}
printf("a=%d\tb=%d\n",a,b);
}

为什么 int temp; 这个变量却不用指针呢?不是int *temp; 这样来呢?

这样来理解指针,程序是运行在内存中的,内存中的数据是有地址的,计算机访问内存数据的唯一途径内存地址。
而指针恰恰是这样一种数据类型。
说的好像和本题无关,别急,看看函数传参过程是怎样的原理。
一个函数
int swap(int a,int b){
a++;
b++;
retun a+b;
}
调用它
int i=10;
int j=20;
int m = swap(i,j);

现在我们都知道 i , j 的值没有改变,这是为什么?原因是函数中的 a,b 是两个临时变量(副本),它们的值分别与i,j相等,但是绝不是同一个变量(即不共享同一块内存),所以对 a,b 的操作不对 i,j 起丝毫影响。
但是为什么传递指针,就可以改变 i,j的值呢?来看
swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
调用
int a,b;
int *pointer_1,*pointer_2;
scanf("%d,%d",&a,&b);
pointer_1=&a;
pointer_2=&b;
swap(pointer_1,pointer_2);
同样,一样的思路,函数中的 p1,p2也是临时变量( pointer_1,pointer_2的副本),但是函数内是这样操作 p1,p2 的: temp = *p1,*p1=*p2,*p2=temp
可以看到这是通过指针取值的操作,因此它实际上是访问到了地址所代表的内存中的值,这是最直接的办法。而不是 p1++ 或 p2-- 等其它操作。

至于为什么要用 int temp 而不用 int *temp,是因为类型不匹配,在这句代码中 temp = *p1 右键类型是 int ,左值类型也应该是 int ,不可能是 int *
这样大意的错误,编译器会帮你检查出来的。