今天学习到的了C语言中-----指针形函数,下面就说一下它的具体内容吧~~
一:
在前面我一学习过了所谓函数类型是指函数返回值的类型。那么在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。
下面是它的形式:
类型说明符 *函数名(形参表)
{
…… /*函数体*/
}
其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。
如:
int *ap(int x,int y)
{
...... /*函数体*/
}
表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。
说到这里我想用一个例子来体现以下吧,回馈!
题:通过指针函数,输入一个1~7之间的整数,输出对应的星期名。
我自己说一下这个程序吧~有漏的地方请大家见谅,并指教一下小弟
首先定义了一个指针型函数day_name,它的返回值指向一个字符串。定义了一个静态指针数组name,name数组初始化赋值为八个字符串,分别表示各个星期名及出错提示。形参n表示与星期名所对应的整数。然后呢输入的整数i作为实参,在printf语句中调用day_name函数并把i值传送给形参n。day_name函数中的return语句包含一个条件表达式,n值若大于7或小于1则把name[0]指针返回主函数输出出错提示字符串“Illegal day”。否则返回主函数输出对应的星期名。主函数中有个条件语句,作用是当输入的i<0(负数)时,程序结束!而exit是一个库函数,exit(1)表示发生错误后退出程序,exit(0)表示正常退出。其实很简单了,好了接着说下面的吧~~~哦,对了还有一点很重要的是:
int (*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。
int*p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号。
二:指针数组和指向指针的指针
1.指针数组的概念:
一个数组的元素值为指针则是指针数组。 指针数组是一组有序的指针的集合。 指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。
2.指针数组说明的形式为:
类型说明符 *数组名[数组长度]
其中类型说明符为指针值所指向的变量的类型。
例如:int *pa[3]
表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量。
为了加深理解,同样练习一下题并说明:通常可用一个指针数组来指向一个二维数组。指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可理解为指向一个一维数组。
说一下过程,其中pa是一个指针数组,三个元素分别指向二维数组a的各行。然后用循环语句输出指定的数组元素。其中*a[i]表示i行0列元素值;*(*(a+i)+i)表示i行i列的元素值;*pa[i]表示i行0列元素值;由于p与a[0]相同,故p[i]表示0行i列的值;*(p+i)表示0行i列的值。读者可仔细领会元素值的各种不同的表示方法。
3.指向指针的指针
概念是如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。
在前面我已经学习过通过指针访问变量称为间接访问。由于指针变量直接指向变量,所以称为“单级间址”。而如果通过指向指针的指针变量来访问变量则构成“二级间址”。
我们来看一下示意图吧:
下来说的一点是怎样定义一个指向指针型数据的指针变量呢?如:char **p;p前面有两个*号,相当于*(*p)。显然*p是指针变量的定义形式,如果没有最前面的*,那就是定义了一个指向字符数据的指针变量。现在它前面又有一个*号,表示指针变量p是指向一个字符指针型变量的。*p就是p所指向的另一个指针变量。
为了加强理解我特意找了个图:
我们可以看到,name是一个指针数组,它的每一个元素是一个指针型数据,其值为地址。name是一个数组,它的每一个元素都有相应的地址。数组名name代表该指针数组的首地址。name+1是mane[i]的地址。name+1就是指向指针型数据的指针(地址)。还可以设置一个指针变量p,使它指向指针数组元素。P就是指向指针型数据的指针变量。
另外一点如果有:
p=name+2;
printf(“%o\n”,*p);
printf(“%s\n”,*p);
则,第一个printf函数语句输出name[2]的值(它是一个地址),第二个printf函数语句以字符串形式(%s)输出字符串“Great Wall”。通过这些总结,我对这部分的内容又加深了理解,以后要吧基础打得扎实了才是硬道理!!
好了今天就现总结到这里吧!今天又更深刻的意识到基础的重要性,好工作的机会是留给有准备并且基础扎实的人的!!!