指针是C语言中的一个重要概念,也是C语言的一个重要特色。正确而灵活地运用它,能够表示复杂的数据结构;能动态分配内存;方便地使用字符串;有效而方便地使用数组;在调用函数时能获得一个以上的结果;能直接处理内存单元地址等,这对设计系统软件是非常必要的。
如果在程序中定义了一个变量,在对程序进行编译时,系统会为这个变量分配内存单元。编译系统根据程序中定义的变量的数据类型,分配一定的长度空间。假设有一个输出语句printf("%d",i),程序是这样执行的:根据变量名与变量地址的关系(这个关系是在编译的时候确定的),找到变量i的地址,从i地址开始后的两个字节中读取数据(也就是i),把它输出。
一个变量的地址称为该变量的指针。如果有一个变量专门用来存放其他变量的地址,那么这个变量成为指针变量。指针变量的值是地址。指针是一个地址,而指针变量是存放地址的变量。
在定义指针变量时要注意两点:
(1)指针变量前面的*表示该变量的类型为指针变量;
(2)在定义指针变量时必须指定基类型。
只有整形变量的地址才能存放到指向整形变量的指针变量中。下面看一个例子
#include<stdio.h>
int main(void)
{
int a, b;
int * pointer_1, * pointer_2;
a = 100;
b = 10;
pointer_1 = &a;
pointer_2 = &b;
printf("%d,%d\n",a,b);
printf("%d,%d\n",*pointer_1,*pointer_2);
return 0;
}
对程序的说明:
(1)在开头定义了两个指针变量pointer_1和pointer_2,但是并没有令它们指向任何一个整型变量。只是提供了两个指针变量,规定它们只能指向整型变量。至于指向哪一个整型变量,需要在程序中指定。
(2)最后的*pointer_1和*pointer_2就是变量a和b。
例子 输入a和b两个整数,按照先大后小的顺序输出a和b。
#include<stdio.h>
int main(void)
{
int a,b;
int * p ,* q;
p = &a;
q = &b;
printf("input two data:");
scanf("%d%d", &a, &b);
if(a<b)
{
p = &b;
q = &a;
}
printf("a=%d,b=%d\n",a,b);
printf("Max=%d,Min=%d\n", *p, *q);
}
a和b本身的值没有变,它们仍然保持原值,但是p和q的值变了,它们指向的变量变了。
函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。
#include<stdio.h>
int main(void)
{
int a, b;
void swap(int * p1, int * p2);
int * pointer_1, * pointer_2;
pointer_1 = &a;
pointer_2 = &b;
printf("input two data:");
scanf("%d%d",&a, &b);
if(a < b)
{
swap(pointer_1, pointer_2);
}
printf("a=%d,b=%d\n",a, b);
printf("Max=%d,Min=%d\n",*pointer_1, *pointer_2);
return 0;
}
void swap(int * p1, int * p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
如果想通过函数调用得到n个要改变的值,可以:
- 在主调函数中设置n个变量,用n个指针变量指向它们;
- 然后将变量指针作为实参,将这n个变量的地址传给所有调用的函数的形参;
- 通过形参指针变量,改变这n个变量的值;
- 主调函数中就可以使用这些改变了值的变量。
例子 输入a,b,c三个整数,按照大小顺序输出
#include<stdio.h>
int main(void)
{
int a, b, c;
int * pointer_1, * pointer_2, * pointer_3;
void exchange(int *, int *, int *);
pointer_1 = &a;
pointer_2 = &b;
pointer_3 = &c;
printf("input three data:");
scanf("%d%d%d",&a, &b, &c);
exchange(pointer_1, pointer_2, pointer_3);
printf("%d %d %d\n",a, b, c);
return 0;
}
void exchange(int * p1, int * p2, int * p3)
{
void swap(int *, int *);
if(*p1 < *p2)
{
swap(p1, p2);
}
if(*p1 < *p3)
{
swap(p1, p3);
}
if(*p2 < *p3)
{
swap(p2, p3);
}
}
void swap(int * p1, int * p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}