设为首页 加入收藏

TOP

C语言指针声明探秘 (二)
2014-11-23 22:53:45 来源: 作者: 【 】 浏览:3
Tags:语言 指针 声明 探秘
printf("%s %s\n",str[0],str[1]);
return 0;
}

#include

int main()
{
char* str[2] = {"liushuai","kobe"};
printf("%s %s\n",str[0],str[1]);
return 0;
}
输出结果显然:
[plain]
liushuai kobe

liushuai kobe

以上是合法的字符二维数组的声明,str是一个有两个元素的数组,每个元素的类型是一个char*,结合上面所讲的,应该不难理解。
返回指针的函数和函数指针
来看下面两个声明语句:
[cpp]
int* foo(int i);

int* foo(int i);
这个应该比较好理解,类比着装有指针的数组的声明char* a[100],这是个函数声明,声明了一个名字为foo的函数,这个函数接受一个类型为int的参数,返回一个指向int型的指针。
再看下面的声明:
[cpp]

void (*bar)();

void (*bar)();
类比着数组的声明,这个语句声明了一个指向函数的指针bar,它指向的函数要求返回值为void,且不接受任何参数。这是一个比较简单的函数的函数指针的声明。
函数既然可以返回一个指针,那么一个函数能不能返回一个指向函数的指针呢?答案是肯定的,看,指针是多么灵活。刚刚接触可能会有点不适应,我们来看一个例子:
[cpp]
int (*foo(int)) (double*,char);

int (*foo(int)) (double*,char);
类比着上面的讲解,我们知道,这个语句声明了一个函数foo,它接受一个int类型的参数,返回一个指向函数的指针,要求指向的函数具有这样的形式:接受一个double类型的指针和char型的变量作为参数,返回一个int类型的值。
我们可以用C中的typedef简化这个声明:
[cpp]
typedef int (*ptf) (double*, char);
ptf foo(int );

typedef int (*ptf) (double*, char);
ptf foo(int );

注意:typedef和#define是不同的,typedef是给“这样”的指针起了一个别名ptf,而不是简单的进行宏替换。
好吧,我们接着来个更变态的,如果一个函数的参数和返回值都是函数指针,那么声明就会更复杂,例如:
[cpp] view plaincopyprint void (*signal (int sig, void (*func) (int siga)) ) ( int siga );

void (*signal (int sig, void (*func) (int siga)) ) ( int siga );
其实慢点分析也不难,我们可以用typedef来简化:
[cpp]
typedef void (*p_sig) (int);
p_sig signal(int sig, p_sig func);

typedef void (*p_sig) (int);
p_sig signal(int sig, p_sig func);
signal这个函数的参数func是一个函数指针,返回了一个函数指针,且两种指针要求指向的函数具有同一种形式(接受一个int型的参数,返回空值)。
通过函数指针调用函数
还是通过一个例子来说明问题:
[cpp]
#include

void printMyName();

int main()
{
void (*f)();
f = printMyName;
f();
f = &printMyName;
f();
return 0;
}

void printMyName()
{
printf("liushuaikobe\n");
}

#include

void printMyName();

int main()
{
void (*f)();
f = printMyName;
f();
f = &printMyName;
f();
return 0;
}

void printMyName()
{
printf("liushuaikobe\n");
}
是不是很容易呢。注意用“&函数名”和“函数名”初始化一个函数指针都是合法的,因为C中函数名会被转换为指向这个函数的指针。
指针真是充满智慧的产物,通过函数指针,可以轻松实现面向对象语言中多态等一些高级特性(例如Java的接口,C++的虚函数),真的太美妙了。
对于大神,这些东西可能都是小儿科,但是本人C真的没怎么用过,搞懂了这些,我也很高兴了。
最后送大家一句话:
不要因为走得太远,就忘了自己当初为什么出发。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇c语言实现双链表 下一篇C语言中的typedef

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: