吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9788|回复: 8
收起左侧

[C&C++ 转载] [新手福利]关于int *p[n]和int (*p)[n]的超详细讲解

  [复制链接]
以指代步 发表于 2013-7-7 19:44
在编程中,会遇到这样的情况:
int *p[n];
int (*p)[n];
还有一种情况是声明函数:
int *p();
int (*p)();
这些分别表示什么意思呢?

表面上看这些问题,好像是指针,但是,如何来正确判断这几个定义,需要我们首先有运算符优先级的概念。

在c语言中,[]和()的优先级比星号(星号的名字叫做“指针运算符”)要高,所以,在这几个声明中,先看[]和()。
同时,这两个括号的运算符的结合顺序,是从左到右的。因此,int *p[n],实际上相当与int *(p[n]),也就是(int *)(p[n])。

让我们来逐步分析:
(int *)(p[n])首先是一个数组(比如,把int *换为int,就是“元素是整形数据的数组”。那么,换为int*,就是“元素是指向整形数据的指针的数组”)。

再看另一个:
int (*p)[n]改变了自然的运算符的优先级,相当于(int)((*p)[n])。一有指针就头疼,我们把指针先替换掉,就是int a[n],是一个n维数组,数组首地址(也就是数组名)是a。
那么,int (*p)[n]也是一个n维数组,但是这个数组的首地址是*p,也就是说,p指向的内容,是一个数组的首地址。
那么,p就是指向一个数组的指针,这个数组中的元素都是int。实际上,p相当于是一个二维指针。

同样的道理,可以分析 int *p();和int (*p)();

注意,这里我们对于星号赋予了不同的含义。阐述如下:
int a;
int *p=&a;//定义指向a的指针p
*p = 10;

这里,第二行中的星号表示“定义了一个指向int型数据的指针,为什么呢?因为实际上,* 相当于 (int *),定义了一个指向int型数据的指针。
第三行的星号,表示p所指向的数据,因为星号前面并没有诸如int void char等表示类型的东西。

换句话说,如果星号前面有表示类型的int,void等数据,我们认为,这里的星号的意义,是“定义了一个指针”
如果星号前面没有表示类型的东西,那么我们认为,这里的星号的意义,是”该指针所指向的数据“。

那么,让我们回头看看int *p[n]和int (*p)[n]。
由于我们刚刚把优先级分析过,那么前者相当于(int *)(p[n]),后者相当于 int ((*p)[n])
根据刚才我们的关于星号的结论,前者表示定义了一个长度为n的数组(p[n]),每个元素都是指向int数据的指针(int *)。
后者表示,定义了一个int a[n]。这里大家都明白,然后把a换成*p,于是意思就是,p是一个指针,其指向的内容(也就是*p)是一个数组的首地址(就是a)

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

592836652a 发表于 2013-7-7 19:58
话说你也是新注册的
 楼主| 以指代步 发表于 2013-7-7 19:59
592836652a 发表于 2013-7-7 19:58
话说你也是新注册的

呵呵、我是加密与解密的爱好者、希望在这个论坛里学习东西、
1354669803 发表于 2013-7-7 20:24
leoqcy 发表于 2013-7-7 20:44
这个真有点看不懂
RedAngel丶 发表于 2013-7-7 21:57
明白了
但为什么你说这个int a[n]是n维数组? ,看过去是一维数组吧
int(*p)(a[n]) //是表示取p针指下的a[n]整数型数据吧
 楼主| 以指代步 发表于 2013-7-7 22:35
RedAngel丶 发表于 2013-7-7 21:57
明白了
但为什么你说这个int a[n]是n维数组? ,看过去是一维数组吧
int(*p)(a[n]) //是表示取p针指下的a[n ...

首先谢谢你仔细读帖子、这一点可能是我的一个小纰漏、我会想出更合理的说法来说明的、
RedAngel丶 发表于 2013-7-7 22:48
以指代步 发表于 2013-7-7 22:35
首先谢谢你仔细读帖子、这一点可能是我的一个小纰漏、我会想出更合理的说法来说明的、

膜拜,正在学习,希望多点这文章,学习下
随风而行 发表于 2014-8-12 13:09
谢谢分享!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 17:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表