CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

面试时候遇到的一个问题,盼望指点!

楼主chenxiyu()2006-07-03 14:40:06 在 C/C++ / C语言 提问

写出下面所指的意思:  
  (1):int   *var[100];  
  (2):int   (*var)[100];    
  (3):   int   *(*   pfun)(int   *(*fn)(void)     (有可能漏了一个括号)  
   
  此乃面试时候遇到的一个试题,第一个还知道,但是第二、第三个就有的迷糊了,盼望高人解析一下! 问题点数:50、回复次数:6Top

1 楼crazy_lazy_pig(疯狂懒猪)回复于 2006-07-03 15:04:17 得分 10

(1)   指向数组的指针  
  (2)   指针的数组  
  (3)   函数指针,其返回值为整型指针,参数为返回整型指针的无参数函数指针.Top

2 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-03 15:06:49 得分 40

(1):int   *var[100];  
   
  定义一个数组,   有100个元素,元素都是   int   *Top

3 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-03 15:09:23 得分 0

(2):int   (*var)[100];    
  定义一个指针,  
  指针指向   一个数组,  
  该数组有   100个int   元素   ...  
   
  如:  
   
  int   arr[10][100];  
  int   (*var)[100];    
  var   =   arr;   //二维数组   arr   本身是一个行指针,每行有   100   个元素(列)  
  ...Top

4 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-03 15:13:17 得分 0

int   *(*   pfun)(int   *(*fn)(void))       //最后漏一个括号  
   
  定义一个函数指针pfun,   pfun指向函数返回值是一个   整型指针,  
  pfun指向函数的参数为       一个函数指针(该函数   返回整型指针,   无参数).  
  Top

5 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-03 15:21:27 得分 0

一点内容,楼主看看:  
   
  右左法则:首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。  
   
                  笔者要对这个法则进行一个小小的修正,应该是从未定义的标识符开始阅读,而不是从括号读起,之所以是未定义的标识符,是因为一个声明里面可能有多个标识符,但未定义的标识符只会有一个。  
   
                  现在通过一些例子来讨论右左法则的应用,先从最简单的开始,逐步加深:  
   
  int   (*func)(int   *p);  
   
  首先找到那个未定义的标识符,就是func,它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是int。  
   
  int   (*func)(int   *p,   int   (*f)(int*));  
   
  func被一对括号包含,且左边有一个*号,说明func是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int   *和int   (*)(int*)这样的形参,返回值为int类型。再来看一看func的形参int   (*f)(int*),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。  
   
  int   (*func[5])(int   *p);  
   
  func右边是一个[]运算符,说明func是一个具有5个元素的数组,func的左边有一个*,说明func的元素是指针,要注意这里的*不是修饰func的,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合,因此*修饰的是func[5]。跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。  
   
   
  int   (*(*func)[5])(int   *p);  
   
  func被一个圆括号包含,左边又有一个*,那么func是一个指针,跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针,现在往左看,左边有一个*号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。  
   
  int   (*(*func)(int   *p))[5];  
   
  func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。  
   
  要注意有些复杂指针声明是非法的,例如:  
   
  int   func(void)   [5];  
   
  func是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,那么接收这个数组的内容的东西,也必须是一个数组,但C语言的数组名是一个右值,它不能作为左值来接收另一个数组,因此函数返回值不能为数组。  
   
  int   func[5](void);  
   
  func是一个具有5个元素的数组,这个数组的元素都是函数。这也是非法的,因为数组的元素除了类型必须一样外,每个元素所占用的内存空间也必须相同,显然函数是无法达到这个要求的,即使函数的类型一样,但函数所占用的空间通常是不相同的。  
   
  作为练习,下面列几个复杂指针声明给读者自己来解析,答案放在第十章里。  
   
  int   (*(*func)[5][6])[7][8];  
   
  int   (*(*(*func)(int   *))[5])(int   *);  
   
  int   (*(*func[7][8][9])(int*))[5];  
   
                  实际当中,需要声明一个复杂指针时,如果把整个声明写成上面所示的形式,对程序可读性是一大损害。应该用typedef来对声明逐层分解,增强可读性,例如对于声明:  
   
  int   (*(*func)(int   *p))[5];  
   
  可以这样分解:  
   
  typedef     int   (*PARA)[5];  
  typedef   PARA   (*func)(int   *);  
   
  这样就容易看得多了。Top

6 楼chenxiyu()回复于 2006-07-03 15:49:11 得分 0

谢谢两位的解答!  
  想问一下   jixingzhong(瞌睡虫:情浓   云淡   风轻   宜私奔!!)     有那些书可以指导吗?(有那些书可以推荐)  
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:chenxiyu
  • crazy_lazy_pig
  • jixingzhong

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo