2012年(41)
分类: C/C++
2012-03-15 13:42:44
在C语言中,一个函数总是占用一段连续的内存区,而函数名就是函数所占用的内存区的首地址。我们可以把函数的这个首地址(或者说是函数的入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数,把这种指向函数的指针变量称为“函数指针变量”。
函数指针变量的一般形式为:
类型说明符 (*指针变量名)();
其中“类型说明符”表示被指向的函数的返回值的类型。“(*指针变量名)”表示“*“后面的变量定义的是指针变量。最后的空括号表示的是指针变量所指向的是一个函数。例如:int (*pf)();表示pf是一个是想函数入口的指针变量,该函数的返回值的整型。
int pointer_number_max()
{
int a=342,b=324,c=234,*max,*min;
if(a>b)
{
max=&a;
min=&b;
}
else
{
max=&b;
min=&a;
}
if(c>*max)
max=&c;
if(c<*min)
min=&c;
printf("max=%d\nmin=%d\n",*max,*min);
return 0;
}
int main()
{
int (*pf)();
pf=pointer_number_max;
pf();
return 0;
}
从上面的代码中可以看出,函数指针变量形式调用函数的步骤如下:
1.先定义函数指针变量。
2.把被调函数的入口地址赋予该函数指针变量。
3.用函数指针变量形式调用函数。
注意:
1.函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量 加减一整数可使指针移动指向后面或者前面的数组元素,而函数指针的移动是毫无意义 的。
2.函数调用中“(*指针变量名)”的两百年的括号不可少,其中的*不应该理解为求职运算,此处它只是一种表示符号。
指针型函数
所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针,这种返回值的函数称为指针型函数。
定义指针型函数的一般形式为:
类型说明符 *函数名(形参表)
{
。。。。。。//函数体
}
其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回指针所指向的数据类型。
应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。如int (*p)()和int *p()是两个完全不同的量。Int (*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)两边的括号不能少。Int *p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整形量的指针,*p两边没有括号。作为函数说明,在括号内最好写上形式参数,这样便于和变量说明区别。
#include
char *day_name(int n)
{
static char *name[]={
"I11egal day","monday","tuesday","wednesday","thursday",
"friday","saturday","sunday"};
return ((n<1||n>7)?name[0]:name[n]);
}
int main()
{
int i;
scanf("%d",&i);
if(i<0)
exit(1);
printf("Day No:%2d-->%s\n",i,day_name(i));
return 0;
}
指针数组
指针数组的说明与使用一个数组的元素值为指针则是指针数组。指针数组是一组有序的指针的集合。指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。指针数组的一般说明形式为:类型说明符 *数组名[数组长度]。
其中类型说明符为指针所指向的变量的类型。例如:int *ps[3]表示pa是一个指针数组,他有三个元素,每个元素值都是一个指针,指向整形变量。通常可以用一个指针数组量指向一个二维数组。指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可以理解为指向一个一维数组。
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];
Main()
{
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],pa[i],*(pa+i));
}
Pa是一个指针数组,三个元素分别指向二维数组a的各行。然后用循环语句输出指定的数组元素。其中*a[i]表示i行0列元素的值,a[i]表示i行的首地址;*(*(a+i)+i)表示i行i列的元素值;*pa[i]表示i行0列元素值;由于p与a[0]相同,故p[i]表示0行i列的值;*(p+i)表示i行i列的值。应该注意是真数组和二位数组指针变量的区别。。这两者虽然都可用来表示二维数组,但是其表示方法和意义是不同的。
二维数组指针变量是单个的变量,其一般形式中“(*指针变量名)”两边的括号不可少。而指针数组类型表示的是多个指针在一般形式中“*指针数组名”两边不能有括号。
指针数组也常用来表示一组字符串,这时指针数组的每个元素被赋予一个字符串的首地址。指向字符串的指针数组的初始化更为简单。例如在指针型函数介绍中举的例子,采用指针数组来表示一组字符串,其初始化为:
static char *name[]={
"I11egal day","monday","tuesday","wednesday","thursday",
"friday","saturday","sunday"};
指针数组作为指针型函数的参数指针数组也可以作为函数的参数。
Int main()
{
int i;
static char *name[]={
"I11egal day","monday","tuesday","wednesday","thursday",
"friday","saturday","sunday"};
Char *ps;
Char *day_name(char *name[],int n);
scanf("%d",&i);
if(i<0)
exit(1);
ps=day_name(name,i);
printf("Day No:%2d-->%s\n",i,ps);
return 0;
}
Int *day_name(char name[],int n )
{
Char *pa,*pb;
Pa=*name;
Pb=*(name+n);
Return ((n<1||n>7)?pa:pb);
}