C语言指针是什么?
代码清单 1:自定义函数交换两个变量的值(错误的解决方法)
运行结果为:
在代码清单 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:用取址运算符 & 获取变量(对象)的内存地址
运行结果为:
在代码清单 2 中,变量 a,b,dA,dB 在内存中的地址可分别用 &a、&b、&dA、&dB 获取(见图 3)。用 printf( ) 函数显示变量地址时要用转化字符

图 3:取址运算符 & 的运用
声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
#include <stdio.h> #include <stdlib.h> /*--自定义函数:交换两个变量的值--*/ 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 <stdio.h> #include <stdlib.h> 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:取址运算符 & 的运用
知识点总结
- 指针实质上是一个变量;
- 指针变量的类型与它指向的变量的类型一致;
- 指针变量里面存储的是它指向的变量在内存中的地址。
声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。