首页 > 编程知识 正文

数组指针与指针数组,指针函数与函数指针

时间:2023-05-05 12:33:57 阅读:61865 作者:3708

指针函数和函数指针

一、指针函数

当函数声明返回值为指针时,它将在调用函数中返回地址,以便在实际需要指针或地址的表达式中使用。

格式:

类型说明符*函数名称(参数) )

当然,因为返回地址,所以类型说明符通常是int。

例如,int *GetDate (;

int*AAA(int,int );

函数常用于返回地址值和返回数组的元素地址。

int*getdate(intwk,int dy );

主() )

{

int wk,dy;

德奥

{

printf(enterweek )1-5(day )1-7)/n );

扫描(' % d % d )、wk、dy );

}

while(wk1|||wk5||dy1|||dy7 );

printf('%d//n ',*getdate ) wk,dy );

}

int*getdate(intwk,int dy ) )。

{

静态int calendar [5] [7]=

{

{1、2、3、4、5、6、7}、

{8、9、10、11、12、13、14},

{15、16、17、18、19、20、21},

{22、23、24、25、26、27、28},

{ 29,30,31,-1}

(;

返回日历[ wk-1 ] [ dy-1 ];

}

程序应该很好理解。 子函数返回数组中某个元素的地址。 输出的是这个地址的值。

二.函数指针

指向函数的指针包含函数的地址,可以调用该函数。 声明的格式如下:

类型说明符(*函数名称()参数() ) ) ) ) ) ) ) )。

其实这里不能叫函数名,应该叫指针的变量名。 此特殊指针指向返回整数值的函数。 指针的声明钢笔和对函数的声明是一致的。

指针名称和指针运算符外部的括号会更改默认运算符的优先级。 如果没有圆括号,它将是返回整数指针的函数的原型声明。

例如:

void(*FPTR ) );

有两种形式可以将函数的地址分配给函数指针:

fptr=Function;

fptr=Function;

地址运算符不是必需的。 因为只有一个函数标识符表示地址,并且对于函数调用,必须包含用括号括起来的参数表。

有两种从指针调用函数的方法:

x=(*fptr ();

x=fptr (;

第二种格式看起来和函数调用一样。 但是,一些程序员倾向于使用第一种格式,因为他们清楚地表明要用指针而不是函数名称来调用函数。 举个例子吧。

语音(*功能) );

语音文件功能(,EditFunc );

主() )

{

funcp=FileFunc;

(*funcp ) );

funcp=EditFunc;

(*funcp ) );

}

Void文件Unc ()

{

文件函数//n (printf );

}

Void编辑函数()

{

printf (编辑函数//n );

}

程序的输出如下。

文件函数

编辑函数

三.指南指南

指针的指针看起来有点莫名其妙。 那些声明有两个星号。 例如:

char ** cp;

如果有三个星号,那就是指针指针,四个星号呢

是指针的指针的指针的指针,依次类推。自然的乌冬面熟悉了简单的例子以后,就可以应付复杂的情况了。当然,实际程序中,一般也只用到二级指针,三个星号不常见,更别说四个星号了。
    指针的指针需要用到指针的地址。
        char c=/'A/';
        char *p=&c;
        char **cp=&p;
    通过指针的指针,不仅可以访问它指向的指针,还可以访问它指向的指针所指向的数据。下面就是几个这样的例子:
        char *p1=*cp;
        char c1=**cp;
    你可能想知道这样的结构有什么用。利用指针的指针可以允许被调用函数修改局部指针变量和处理指针数组。

        void FindCredit(int **);

        main()
        {
            int vals[]={7,6,5,-4,3,2,1,0};
            int *fp=vals;
            FindCredit(&fp);
            printf("%d//n",*fp);
        }

        void FindCredit(int ** fpp)
        {
            while(**fpp!=0)
            if(**fpp<0) break;
            else (*fpp)++;
        }

    首先用一个数组的地址初始化指针fp,然后把该指针的地址作为实参传递给函数FindCredit()。FindCredit()函数通过表达式**fpp间接地得到数组中的数据。为遍历数组以找到一个负值,FindCredit()函数进行自增运算的对象是调用者的指向数组的指针,而不是它自己的指向调用者指针的指针。语句(*fpp)++就是对形参指针指向的指针进行自增运算的。但是因为*运算符高于++运算符,所以圆括号在这里是必须的,如果没有圆括号,那么++运算符将作用于二重指针fpp上。

四、指向指针数组的指针
    指针的指针另一用法旧处理指针数组。有些程序员喜欢用指针数组来代替多维数组,一个常见的用法就是处理字符串。

        char *Names[]=
        {
             "Bill",
             "Sam",
             "Jim",
             "Paul",
             "Charles",
             0
        };

        main()
        {
            char **nm=Names;
            while(*nm!=0) printf("%s//n",*nm++);
        }

    先用字符型指针数组Names的地址来初始化指针nm。每次printf()的调用都首先传递指针nm指向的字符型指针,然后对nm进行自增运算使其指向数组的下一个元素(还是指针)。注意完成上述认为的语法为*nm++,它首先取得指针指向的内容,然后使指针自增。
    注意数组中的最后一个元素被初始化为0,while循环以次来判断是否到了数组末尾。具有零值的指针常常被用做循环数组的终止符。程序员称零值指针为空指针(NULL)。采用空指针作为终止符,在树种增删元素时,就不必改动遍历数组的代码,因为此时数组仍然以空指针作为结束。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。