1.指针
内存单元的编号也叫做地址。既然根据内存单元的编号或者地址就可以找到所需的内存单元,所以通常把这个地址称为指针。
1>指针变量
在C语言中,允许用一个变量来存放指针,这种变量称为指针变量,因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
类型说明符 *变量名
int *p2;
float *p3;
char *p4;
指针变量只能指向自己同类型的变量。
两个有关的运算符:
- &:取地址运算符;
- *:指针运算符(或称“间接访问” 运算符)。
指针变量初始化的方法:
int a;
int *p=&a;
赋值语句的方法:
int a;
int *p;
p=&a;
注意:1.不允许吧一个数赋予指针变量。int *p;p=1000;
小应用:输入a和b两个整数,按先大后小的顺序输出a和b。
#include
main(){
int *p1,*p2,*p,a,b;
scanf("%d,%d",&a,&b);
p1=&a;p2=&b;
if(a
p=p1;
p1=p2;
p2=p;
}
printf("\na=%d,b=%d\n",a,b);
printf("max=%d,min=%d\n",*p1, *p2);}
return 0;
}
2.函数指针变量:
在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”。
函数指针变量定义的一般形式为:
其中“类型说明符”表示被指函数的返回值的类型。“(* 指针变量名)”表示“*”后面的变量是定义的指针变量。最后的空括号表示指针变量所指的是一个函数。例如:
其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。
int *p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。
其中类型说明符为指针值所指向的变量的类型。例如:
表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量。
示例如下:
int max(int a,int b)
{
if(a>b)
return a;
else return b;}
main()
{
int max(int a,int b);
int(*pmax)();
int x,y,z;
pmax=max;
printf("input two numbers:\n");
scanf("%d%d",&x,&y);
z=(*pmax)(x,y);
printf("maxmum=%d",z);
return 0;
}
2.指针型函数
所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。定义指针型函数的一般形式为:
int *ap(int x,int y){
表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。
int (*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。
3.指针数组
一个数组的元素值为指针则是指针数组,指针数组是一组有序的指针的集合。指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。指针数组说明的一般形式为:
通常可用一个指针数组来指向一个二维数组。也可理解为指向一个一维数组。
int main()
{
int a[3][3]={1,2,3,4,5,6,7,8,9};
int *pa[3]={a[0],a[1],a[2]};
int *p=a[0]; int i;
for(i=0;i<3;i++)
printf("%d,%d,%d\n",a[i][2-i],*a[i],*(*(a+i)+i));
for(i=0;i<3;i++)
printf("%d,%d,%d\n",*pa[i],p[i],*(p+i));
return 0;
}