地址和指针的概念
地址
当我们在程序中定义了一个变量之后,系统会给这个变量分配储存空间。不同的变量类型,系统分配的内存长度也不同,整型变量2个字节,浮点型变量4个字节,字符变量1个字节。内存区的每一个字节都有一个编号,就像宾馆房间号都有房间号一样,这就是地址。在内存中存放数据,就和房间里住了个人一样。对变量值的存取是通过地址实现的。比如说定义了整型变量i,编译时系统分配2000,2001这两个字节给它,需要输出时系统再找到变量i的地址从2000往后的两个字节,把它输出出来。
指针
在c语言中,除了整型,浮点型,字符型变量,还有一种专门存放变量地址的特殊变量,它可以将整型变量i的地址存进自身,当需要变量i时,可以通过它知道变量i的地址,再通过地址找到变量i在内存单元中的值。由于通过地址可以找到变量的内存单元,我们可以说地址指向该变量单元就像一个房间号指向一个房间一样。所以在C语言中地址被称作指针。
一个变量的地址称作变量的指针。而专门用来存储指针的那个特殊变量就是指针变量。指针变量中存放的值就是地址(指针)。
变量的指针和指向变量的指针变量
为了表示变量和它所指变量之间的联系,在程序中用“*”符号表示“指向的对象”。
定义一个指针变量
在C语言中所有变量使用前都是要定义的,指定其类型,为其分配存储空间,指针变量是为了存放地址的变量,使用前必须定义。就像:
int i, j;
int * pointer_1, pointer_2;
定义指针变量的一般形式为:
基类型 * 指针变量名;指针变量前面的*表示该变量时指针变量。
基类型是定义指针变量的时必须指定的,它用来指定指针变量可以指向的变量的类型,int类型的指针变量可以指向整形变量,而不能指向其他类型变量。
一个指针变量只能指向同一个类型的变量,不能一会指向整型变量,一会指向浮点型变量。
可以用赋值语句使一个指针变量得到另一个变量的地址,让它指向一个变量。pointer_1 = &a, pointer_2 = &b;p1、p2表示a, b在内存单元的地址。而*p1则表示,这块内存地址中的值。
指针变量做函数参数
函数的参数不仅是整形、浮点型、字符型等数据,还可以是指针型,作用是将变量的地址传给另一个函数中。
#include<stdio.h>
void swap(int * p1, int * p2);
int main()
{
int a, b;
int * pointer_1,* pointer_2;
scanf("%d %d", &a, &b);
if(a < b) swap(pointer_1, pointer_2);
printf("\n%d %d\n", a, b);
}
void swap(int * p1, int * p2)
{
int t;
t = *p1;
*p1 = *p2;
*p2 = t;
}