int *(*p)[4];什么意思

yukiwang313 2011-01-21 04:42:23
高手指教。。最好能有例子说明 3Q
...全文
9879 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluepei28 2011-01-25
  • 打赏
  • 举报
回复
二楼正解![Quote=引用 2 楼 l369294289 的回复:]

int *(*p)[4];(*P)表示p是一个指针,然后与右边的【】结合,表示P是指向一个有四个元素的数组,
int *表示返回指向整形的指针,所以int *(*p)[4];表示p指向一个有含有四个指向整形的指针元素的数组
[/Quote]
bluepei28 2011-01-25
  • 打赏
  • 举报
回复
正解!月经贴了[Quote=引用 1 楼 last_c_ 的回复:]

数组指针的指针
[/Quote]
xl_at 2011-01-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ypzhong 的回复:]

c专家编程有一章专门介绍c语言声明建议去看看,能理解更深入。
[/Quote]
顶 自从哥看了那章分析声明的 腰不疼了 腿也不酸了
zps007 2011-01-23
  • 打赏
  • 举报
回复
复杂啊。。。学习了
zyouth 2011-01-23
  • 打赏
  • 举报
回复
受教了
wangchensong 2011-01-23
  • 打赏
  • 举报
回复
指针数组指针???呵呵 不确定
kingkingoflove 2011-01-23
  • 打赏
  • 举报
回复
指向指针数组的指针
kingkingoflove 2011-01-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bluesky12312388 的回复:]
C/C++ code
int *(*p)[4];

int arr[4]; //数组

int (*pArr)[4]; //指向 含有4个元素的指针

pArr = &arr;

p = &pArr; //指向含有4个元素数组的指针的指针
[/Quote]
正解正解正正解
xiangchendub 2011-01-23
  • 打赏
  • 举报
回复
看看12楼的总结,谢谢。
proorck6 2011-01-22
  • 打赏
  • 举报
回复
别着急,慢慢来。
wizard_tiger 2011-01-22
  • 打赏
  • 举报
回复
二楼正解!
csdn上有关于指针的资源。
另外看一下《C和指针》
zhutianjin4355255 2011-01-22
  • 打赏
  • 举报
回复
指针数组指针
zhusizhi007 2011-01-21
  • 打赏
  • 举报
回复
记住以下原则:
a. (*fun)() == fun() == (fun)()==(**fun)(); //注意最后一个fun周围的括号会被忽略,所以((void (*)())0) () == ( *(void (*)())0 )()
b. 函数不可以返回数组,但可以返回指向数组的指针,
c. 函数不可以返回函数,但是可以返回指向函数的指针。
d. (*p)[3] 和*p[3] 的结合性不同,注意上面(*fun)() == fun() ,但是(*fun)[5] != fun[5],p5[2]()不合法 ,要改为(*p5[2])()
e. 形参类型不可以被括号包围,但是形参名可以:错误: int (*(*pf2[3])((int (*)()), char) )[5];
//int (*(*pf2[3])(int (*)(), char) )[5]; 正确





int (* pfunc(int ))[10]; //可以通过编译。返回指向数组的指针.
int (* parr[2])(int );//定义了一个变量parr,它是一个数组,每个数组的元素是一个指向函数的指针,该函数接受一个int 变量,返回int。

int *(* parr[2])(int );//定义了一个变量parr,它是一个数组,每个数组的元素是一个指向函数的指针,该函数接受一个int 变量,返回int *。

int (*(*pf)(int ,int ))(float);//pf是一个函数的指针,指向的函数的类型是有两个 int参数且返回一个指向函数的指针。
//返回的函数的指针指向一个带接受float参数并返回 int 的函数。

int *(*(*p4(int (*)(int),float)))(int (*m)(),int); //分析的说明:
//从内向外读:分为:(*(*p4(int (*)(int),float))) 和(int (*m)(),int)
//(*p4(int (*)(int),float)) 表示为一个指向函数的指针,返回的是:int * (*)((int (*m)(),int),也是一个指向函数的指针.

//类似的还可以增加嵌套:(注意加的形式为:(*)(),只可以返回指向函数的指针,不可以返回函数).


int *(*(*(*p5(int (*)(int),float)))(int (*m)(),int))(int);
//与以下的等价:

int *(*(*(*p5(int (*a)(int),float)))(int (*m)(),int))(int );

如果要定义为函数指针数组,则只可以对第一个变量名加上数组的标识(注意必须为另一种格式,其它都是错误的,
int *(*(*(*p5[2](int (*a)(int),float)))(int (*m)(),int))(int ); //错误,p5[2]()不合法
int *(*(*((*p5[2])(int (*a)(int),float)))(int (*m)(),int))(int ); //正确,(* p5[2])()合法


//以下编译通过。说明:ppfunc变成了一个指向函数指针数组的指针,
//好象只有通过typedef才可以定义出来,对于一般的指针数组,也可以定义出int (*par[5])[6]之类
//即是指向数组的指针,本身又是数组,但是对于函数指针,现在不知道该如何定义。
typedef int (*pfuncs)(int (int),float);
pfuncs (* ppfunc(int ))[10]; //注意如果是:pfuncs ((* ppfunc)(int ))[10]; 则出错,函数返回的是数组
pfuncs (* pfuncar[3])(int ); //OK
int (*par[5])[6];

pfuncs (* pfuncar[3](int ))[3]; //错误:数组元素类型不能是函数。
zhusizhi007 2011-01-21
  • 打赏
  • 举报
回复
在C语言中,如果是这类问题,最好用typedef ,这样看得很明显:
typdef int * PINT ;
typdef PINT (*PARR4)[4];
zhusizhi007 2011-01-21
  • 打赏
  • 举报
回复
个人总结:
总结:
1。如果是函数指针数组,则写成如下形式:
pfuncs (* pfuncar[3])(int ); //注意pfuncar[] 两侧有括号。
或:

2。如果是指向数组的指针(数组中的单个元素为函数指针),则写成如下形式,但不可以两个同时,即:即是数组,又指向数组。
typedef int (*pfuncs)(int (int),float);
pfuncs (* ppfunc(int ))[10]; //注意与上面相反,ppfunc两侧没有括号,与函数形式相连。
如果函数指针返回的又是函数指针,则要写成如下形式,注意[3]的位置。
int (*(* ppf(int, float))[3])(int ,int) ; //注意;[3]放的位置和ppf函数指针的格式与(* p)(int ,float)是不一样的。
3。两者同时皆是,可以用typedef 的形式来写:
typedef int (*PF)(int ,float);
typedef PF (* PPFUNC)(int ,char);
PPFUNC (* mypfunc[3])[4];
4。函数指针的调用有两种方法:如:
int (*pfun)(int ); /*有后面此函数*/ int testFun(int );
pfun=testFun;
pfun(55); //OK,调用正确
(*pfun)(55); // OK ,与上面的调用意义相同。
5。将固定位置转换为函数指针调用,如0:
(*(void (*)())0)(); //如果是(*(void *())0)(); 则出错,因为0指向了一个函数而不是函数指针。
//((void (*)())0)(); 也是正确的,//少了第一个*号,实际上是等于(func)(),在函数名加上括号,与不加括号是一样的。
//(**(void (*)())0)(); (***(void (*)())0)(); 的结果也是一样的,因为对于函数指针,加一个或是多个*号都是一样的。
//(*(*)())0)(); 则是错误的,因为强制转换的函数指针没有返回值,所以为错误。
//(void (*)())0(); 不会报错,但是意义不一样,VS2008中的告警为: warning C4353: 使用了非标准扩展: 常量 0 作为了函数表达式。请改用“__noop”内部函数
//即表示,0即为不停机,该二进制码为

////////////////以下为CSDN上的精辟解释,可以分解为四种形式,再加以组合///////////////////////
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是一个指向数组的指针,现在往左看,左边有一个*号,说明这个数组的元素是指针,再跳出括号,
右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指针,
这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。

int (*(*func)(int *p))[5]; //返回指向数组的指针, 特别注意此处func前要两个*号
func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。

int (*(*pf)(int))(char); //返回指向函数的指针 int (*(pf(int)))(char); 也可以

以下三个编译通过:
int (*(*funcs[3])[5])(int *p);

int (*(*(*funcs[3])[5])(int *p))[4];

int (*(*(*(*pfuncs[3])[5])(int *p))[4])(int);
taodm 2011-01-21
  • 打赏
  • 举报
回复
楼主要么还是找本《C和指针》,把这方面的知识一步补到位吧。
flysnowhite 2011-01-21
  • 打赏
  • 举报
回复
向这类定义声明,一般按照从内向外进行解读。首先,p是一个指针,该指针指向一个数组,数组里的每个元素都是指针。
Microsues 2011-01-21
  • 打赏
  • 举报
回复
http://blog.csdn.net/Microsues/archive/2011/01/11/6129014.aspx
feng4206yu 2011-01-21
  • 打赏
  • 举报
回复
p为指向数组的指针,该数组存储指向整形的指针.因为[]操作符的优先级比*要大点
bluesky12312388 2011-01-21
  • 打赏
  • 举报
回复
int *(*p)[4];

int arr[4]; //数组

int (*pArr)[4]; //指向 含有4个元素的指针

pArr = &arr;

p = &pArr; //指向含有4个元素数组的指针的指针
加载更多回复(3)

70,005

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧