﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-让梦想自由的飞翔     garland-随笔分类-C</title><link>http://www.cppblog.com/garland/category/1976.html</link><description>garland</description><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 18:15:47 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 18:15:47 GMT</pubDate><ttl>60</ttl><item><title>typedef</title><link>http://www.cppblog.com/garland/archive/2007/03/28/20753.html</link><dc:creator>郭大伟</dc:creator><author>郭大伟</author><pubDate>Wed, 28 Mar 2007 03:32:00 GMT</pubDate><guid>http://www.cppblog.com/garland/archive/2007/03/28/20753.html</guid><wfw:comment>http://www.cppblog.com/garland/comments/20753.html</wfw:comment><comments>http://www.cppblog.com/garland/archive/2007/03/28/20753.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/garland/comments/commentRss/20753.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/garland/services/trackbacks/20753.html</trackback:ping><description><![CDATA[
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt">
												<h4 class="TextColor1" style="MARGIN-BOTTOM: 0px">关于typedef的用法</h4>
												<div>
														<div>
																<font color="#000000" size="3">
																</font>
														</div>
														<p>
																<font size="3">
																		<font color="#000000">一.基本概念剖析</font>
																</font>
														</p>
														<p>
																<font color="#000000" size="3">int* (*a[5])(int, char*);     //＃1 <br />void (*b[10]) (void (*)()); //＃2 <br />double(*)() (*pa)[9];        //＃3 </font>
														</p>
														<p>
																<br />
																<font color="#000000" size="3">1．C语言中函数声明和数组声明。函数声明一般是这样：<br />int fun(int, double);<br />对应函数指针（pointer to function）的声明是这样：<br />int (*pf)(int, double)；<br />可以这样使用：<br />pf = &amp;fun;     //赋值（assignment）操作 <br />(*pf)(5, 8.9);//函数调用操作 <br />也请注意，C语言本身提供了一种简写方式如下：<br />pf = fun;      // 赋值（assignment）操作 <br />pf(5, 8.9);    // 函数调用操作<br />不过我本人不是很喜欢这种简写，它对初学者带来了比较多的迷惑。 <br />数组声明一般是这样：<br />int a[5]；<br />对于数组指针（pointer to array）的声明是这样：<br />int (*pa)[5];<br />可以这样使用：<br />pa = &amp;a；           // 赋值（assignment）操作 <br />int i = (*pa)[2]； // 将a[2]赋值给i； </font>
														</p>
														<p>
																<font color="#000000" size="3">2.有了上面的基础，我们就可以对付开头的三只纸老虎了!：） 这个时候你需要复习一下各种运算符的优先顺序和结合顺序了，顺便找本书看看就够了。 <br />＃1：int* (*a[5])(int, char*);<br />首先看到标识符名a，“[]”优先级大于“*”，a与“[5]”先结合。所以a是一个数组，这个数组有5个元素，每一个元素都是一个指针，<br />指针指向“(int, char*)”，对，指向一个函数，函数参数是“int, char*”，返回值是“int*”。完毕，我们干掉了第一个纸老虎。：）<br />＃2：void (*b[10]) (void (*)());<br />b是一个数组，这个数组有10个元素，每一个元素都是一个指针，指针指向一个函数，函数参数是“void (*)()”【注1】，返回值是“void”。完毕！<br />注1：这个参数又是一个指针，指向一个函数，函数参数为空，返回值是“void”。 <br />＃3：double(*)()(*pa)[9];<br />pa是一个指针，指针指向一个数组，这个数组有9个元素，每一个元素都是“double(*)()”【也即一个指针，指向一个函数，函数参数为空，返回值是“double</font>
																<font color="#000000" size="3">”】。(注意typedef int* p[9]与typedef int(*p)[9]的区别，前者定义一个数组，此数组包含9个int*类型成员，而后者定义一个指向数组的指针，被指向的数组包含9个int类型成员)。<br />现在是不是觉得要认识它们是易如反掌，工欲善其事，必先利其器！我们对这种表达方式熟悉之后，就可以用“typedef”来简化这种类型声明。 <br />＃1：int* (*a[5])(int, char*);<br />typedef int* (*PF)(int, char*);//PF是一个类型别名【注2】。 <br />PF a[5];//跟int* (*a[5])(int, char*);的效果一样！ <br />注2：很多初学者只知道typedef char* pchar；但是对于typedef的其它用法不太了解。Stephen Blaha对typedef用法做过一个总结：“建立一个类型别名的方法</font>
																<font color="#000000" size="3">很简单，在传统的变量声明表达式里用类型名替代变量名，然后把关键字typedef加在该语句的开头”。 <br />＃2：void (*b[10])(void (*)());<br />typedef void (*pfv)(); <br />typedef void (*pf_taking_pfv)(pfv);<br />pf_taking_pfv b[10]; //跟void (*b[10]) (void (*)());的效果一样！ <br />＃3. double(*)()(*pa)[9]; <br />typedef double(*PF)();<br />typedef PF (*PA)[9]; <br />PA pa; //跟doube(*)()(*pa)[9];的效果一样！</font>
														</p>
												</div>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/garland/aggbug/20753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/garland/" target="_blank">郭大伟</a> 2007-03-28 11:32 <a href="http://www.cppblog.com/garland/archive/2007/03/28/20753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>