C语言中指针是一个较为复杂而又重要的概念,有关指针的定义类型和操作也比较多,最近回顾了谭浩强出版的《C程序设计(第二版)》,作个小结如下:
int *p; p为指向整型数据的指针变量
int (*p)[n]; 表示p是一个指针变量,它指向包含4个整型元素的一维数组;
可以对下面二者做比较:
(1) int a[4]; 表示a有4个元素,每个元素为整型
(2) int (*p)[4]; 表示*p有4个元素,每个元素为整型
上述二者区别在于a是一个指针常量,p 是一个指针变量,且只能指向一个包含4个元素的一维数组。
int *p[n]; 表示定义指针数组p,它由n个指向整型数据的指针元素组成
用法:char *name[]={"Follow me","BASIC","Great Wall"};
printf("%s\n",name[i]);
name[i]中存放的是各字符串的首地址,而指针数组名name是该指针数组的首地址
int (*p)(); p为指向函数的指针变量,该函数返回一个整型值
用法:int max(int x,int y) {....}
int min(int x,int y) {.....}
int process(int x,int y,int(*fun)(int,int))
{
int result;
result=(*fun)(x,y);
return(result);
}
...
max_value=process(3,6,max);
min_value =process(9,24,min);
将函数的入口地址(即函数名)作实参传递给process函数中的形参fun(fun是指向函数的指针变量,*fun是一个整型函数,有两个整型形参),可实现每次调用process函数完成不同的功能。
int *p(); 表示p为一个返回指针值的函数,且该指针指向整型数据
用法:float *search(float *pointer,int n)
{
float *pt;
pt=pointer+n;
return(pt);
}
int * *p; 指针的指针:p是一个指针变量,它指向一个指向整型数据的指针变量
用法:char *name[]={"Follow me","BASIC","Great Wall"};
char **p;
int i;
for(i=0;i<3;i++)
{
p=name+i;
printf("%s\n",*p);/*输出字符串时,需用各字符串的首地址*p,不用**p*/
}
除上述几种定义和用法以为,ANSI新标准增加了一种“void”指针类型,即可定义一个指针变量,但不指定它是指向哪一种类型数据
用法:char *p1;
void *p2;
......
p1=(char *)p2; /*需对void指针进行强制类型转换*/
p2=(void *)p1; /*同样进行强制类型转换*/
......
void *fun(char c1,char c2) {...} /*表示函数fun返回的是一个指针,它指向空类型*/
p1=(char *)fun(c1,c2); /*同样进行强制类型转换*/
总结:指针使用非常灵活,可以利用它编写出颇有特色、质量优良的程序,实现许多用其他高级语言难以实现的功能,但也十分容易出错,而且这种错误难以发现,比如由于未对指针变量p赋值就向*p赋值,就有可能破坏有用的单元的内容,因此,使用指针要非常注意,积累经验。