C语言指针是什么?

代码清单 1:自定义函数交换两个变量的值(错误的解决方法)
#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:取址运算符 & 的运用

知识点总结

  • 指针实质上是一个变量;
  • 指针变量的类型与它指向的变量的类型一致;
  • 指针变量里面存储的是它指向的变量在内存中的地址。