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