再学习c指针-指针与函数

2014-07-24

这是一年前的笔记。

指针作为参数


例如:

#include <stdio.h>
void add(int *m);
int main(int argc, const char *argv[])
{
    int i=9;
    add(&i);
    printf("%d\n",i);
    return 0;
}
void add(int *m)
{
    (*m)++;
}

又例如:

#include <stdio.h>
void add(int *m,int size);
int main(int argc, const char *argv[])
{
    int p[3]={1,2,3};
    add(p,3);
    printf("%d,%d,%d\n",p[0],p[1],p[2]);
    return 0;
}
void add(int *m,int size)
{
    int i;
    for(i=0;i<size;i++)
    {
        m[i]++;
    }
}

如果声明的函数用int *修饰


代表这个函数应该返回int型指针。

关于函数名


函数名本身代表了它自己的首地址,例如:

#include <stdio.h>
void add(int *m,int size);
int main(int argc, const char *argv[])
{
    int p[3]={1,2,3};
    printf("%p\n",add);
    return 0;
}
void add(int *m,int size)
{
    int i;
    for(i=0;i<size;i++)
    {
        m[i]++;
    }
}

函数指针


既然函数名代表函数的地址,那么我们就可以自定义一个函数指针指向其他函数。例如:

#include <stdio.h>
int add1(int m);
int add2(int m);
int (*fp)();
int main(int argc, const char *argv[])
{
    int i=1;
    fp=add1;
    i=(*fp)(i);
    printf("%d\n",i);
    fp=add2;
    i=(*fp)(i);
    printf("%d\n",i);
    return 0;
}
int add1(int m)
{
    return m++;
}
int add2(int m)
{
    return m+2;
}

运行结果如下:

1
3

可以看到return m++;并未达到预期,应该改成return ++m;才能够使得返回值是m加1。

用指向函数的指针作参数


例如:

#include <stdio.h>
int add1(int m);
int add2(int m);
int add(int m,int(*fun)(int n));
int main(int argc, const char *argv[])
{
    int i=1;
    i=add(i,add1);
    printf("%d\n",i);
    i=add(i,add2);
    printf("%d\n",i);
    return 0;
}
int add1(int m)
{
    return ++m;
}
int add2(int m)
{
    return m+2;
}
int add(int m,int(*fun)(int n))
{
    return (*fun)(m);
}

linux下pthred库、signal库中有很多函数以函数作为参数。此时作为参数的函数也称为“回调函数”。

如果数组的元素全部是函数


如下:

#include <stdio.h>
void a();
void b();
int main(int argc, const char *argv[])
{
    void (*fun[])()={a,b};
    (*fun[0])();
    fun[1]();
    return 0;
}
void a()
{
    printf("i am a\n");
}
void b()
{
    printf("i am b\n");
}

运行结果如下:

i am a
i am b
( 完 )