代码清单 1:自定义函数交换两个变量的值(错误的解决方法)
#include
#include
/*--自定义函数:交换两个变量的值--*/
void swap(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
/*--主函数--*/
int main( )
{
system("color 70");
int dA, dB;
puts("请输入两个整数:");
printf("整数dA:");
scanf("%d",&dA);
printf("整数dB:");
scanf("%d",&dB);
swap(dA,dB);
puts("互换以后的变量值:");
printf("dA=%d dB=%d\n",dA,dB);
system("pause");
return 0;
}
运行结果为:
请输入两个整数:
整数dA:10
整数dB:8
互换以后的变量值:
dA=10 dB=8
在代码清单 1 的程序中,main( ) 函数调用 swap( ) 函数时,实参 dA、dB 的值分别传给形参 a 和 b(值传递),在 swap( ) 函数内变量 a 和 b 的值进行了互换。但是,变量 a 和 b 只是实参变量 dA、dB 的副本,变量 dA、dB 本身的值并没有改变。因此,在此代码中使用函数并没有实现变量 a 和 b 的值的交换(见图 1)。
图 1:函数中形参变量值的改变并不影响实参变量的值
为了解决这个问题,我们可以使用 C语言提供的指针(pointer)。指针实质上是一个变量,该变量里面存储的是某个特定变量在内存中的地址,我们把它表述为指向该特定变量的指针变量(指针),该指针变量的类型与它指向的变量的类型一致。
变量是计算机内存中存储数值的“小房子”,这些小房子在内存空间中并不是杂乱无章地随便放置的,而是如图 2b) 所示,有序排列在内存空间中的。这些存放在内存空间中的变量我们统称为对象。变量(对象)在内存空间中的存放位置就是其内存地址。在 C语言中,我们可以用取址运算符&获取一个变量(对象)的内存地址(十六进制数)。
图 2:内存中的变量(对象)
代码清单 2:用取址运算符 & 获取变量(对象)的内存地址
#include
#include
int main( )
{
system("color 70");
int a, b, dA, dB;
printf("a 的地址:%p \n", &a);
printf("b 的地址:%p \n", &b);
printf("dA的地址:%p \n", &dA);
printf("dB的地址:%p \n\n\n", &dB);
system("pause");
return 0;
}
运行结果为:
a 的地址:0060FEFC
b 的地址:0060FEF8
dA的地址:0060FEF4
dB的地址:0060FEF0
在代码清单 2 中,变量 a,b,dA,dB 在内存中的地址可分别用 &a、&b、&dA、&dB 获取(见图 3)。用 printf( ) 函数显示变量地址时要用转化字符%p。
图 3:取址运算符 & 的运用
知识点总结
指针实质上是一个变量;
指针变量的类型与它指向的变量的类型一致;
指针变量里面存储的是它指向的变量在内存中的地址。