指针
—————指针变量作函数参数的实例(交换两个数的值)
程序一:
(基本类型变量作函数参数)
#include<stdio.h>
void Swap(int x,int y);
int main()
{
int a,b;
a = 5;
b = 9;
Swap(a,b);
printf("a=%d b=%d",a,b);
return 0;
}
void Swap(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
运行结果:
发现a和b的值并没有交换,那这是为什么呢?
先别急,咱们看看下面这种写法:
程序二:
(指针类型变量作函数参数)
#include<stdio.h>
void Swap(int x,int y);
int main()
{
int a,b;
a = 5;
b = 9;
Swap(&a,&b);
printf("a=%d b=%d",a,b);
return 0;
}
void Swap(int *x,int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
运行结果:
发现a和b的值交换了,那为什么第一种方法就不行呢,听我一一细说:
首先这两个程序在函数调用时的实参是不同的,第一个程序在函数调用的时候是将变量a和b的值传给形参,所以形参变量x和y得到的是实参变量值的一个副本,那么在被调函数中交换的是x和y的值,但是由于形参和实参在内存中是占用不同的存储单元的,所以形参值的改变是没有影响到实参的,所以第一个程序只是实现了形参值的改变;而第二个程序是将实参变量a和b的地址值传给形参,由于形参x和y得到了实参变量a和b的地址值,所以形参x和y就分别指向了实参a和b,虽然形参和实参还是占用不同的内存单元的,但是由于形参是一个指针类型的变量,它得到了实参变量的地址值,这样就可以通过间接寻址的方式来访问形参变量所指向的内存单元了。
注意:
1.不能借助一个未初始化的指针变量进行两数互换
void Swap(int *x,int *y)
{
int *temp;
*temp = *x;
*x = *y;
*y = temp;
}
2.借助指针pTemp交换的是地址值(即x和y的指向),不是指针指向的内容
void Swap(int *x,int *y)
{
int *pTemp;
pTemp = x;
x = y;
y = pTemp;
}