C语言,一个关于数组指针的问题。

int(*p)[5];我知道p是一个指向数组的指针。我想问的是他指向一个什么样的数组,p指向一维数组,还是二维数组。为什么。如果p的的值是0x0028ff00,那么p+1... int (*p)[5];
我知道p是一个指向数组的指针。
我想问的是他指向一个什么样的数组,p指向一维数组,还是二维数组。为什么。
如果p的的值是0x0028ff00,那么p+1的值是多少。为什么?
展开
 我来答
sunchy12345678
2013-08-07 · TA获得超过665个赞
知道小有建树答主
回答量:443
采纳率:100%
帮助的人:340万
展开全部

根据解析规则,上述声明器解析为指向int[5]型变量的指针

也就是指向大小为5的int型数组

所谓指向,私以为是p = &...的形式。

比如

int arr[10][5];
int (*p)[5];
p = &arr[0];

注意arr是二维数组,其声明等同于int (arr[10])[5],所以arr[0]的类型就是int[5]。故上述语句将p指向了一个int[5]型的变量。

如果arr不是如此声明,比如

int arr[10][4];
int (*p)[5];
p = &arr[0];

此时编译器可以给出一个警告。

顺便说一句,C的声明器中,数组声明器和函数声明器后置真是奇葩。

不如Java等等直观。如果C的声明语法像这样:

int[][] a;

就能一眼看出a是什么了。

追问
恩,我已经看懂了。那么p+1是怎么算的呢
按照你说的
p=&arr[0];// 相当于 p=arr+0=arr

那么p+1的值应该就是arr+1
也就是二维数组arr的第二行的首地址。

是这样吧?
追答

p是一个指针。p+1结果就指向了arr[0]的后面。也就是指向了arr[1]。

运行一下试试:

#include <stdio.h>

int arr[10][5];
int (*p)[5];

int main(void)
{
    p = &arr[0];
    printf("%p\n", p);
    ++p;
    printf("%p %p\n", p, &arr[1]);
    return 0;
}
GodHlpMe
2013-08-07 · TA获得超过8455个赞
知道大有可为答主
回答量:4600
采纳率:46%
帮助的人:946万
展开全部
指向的二维数组: int z[ ][5];
如: int z[100][5];
可以 p=z;
追问
为什么?
追答
int (*p)[5];
就是指向列为5个单元的二维数组。
也有说,指向 5个单元的数组,其实是一回事。
p就是相当于 int p[ ][5];
int z[100][5];
int (*p)[5];
p=z;
这样编译不会报警!
这p就可访问z的所有单元,z[i][j]与p[i][j] 是同一单元,
自已体会一下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
纠结的小青年
2013-08-07 · 超过19用户采纳过TA的回答
知道答主
回答量:95
采纳率:0%
帮助的人:48.5万
展开全部
想知道p指向什么样的数组,把p去掉,变成int (*)[5].这样可看出p指向的是一个一维数组。
另 p指向的内容是数组,所有p+1应该是0x0028ff00 + sizeof(int)*5
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
我是谁呢lq1990
2013-08-07 · 超过31用户采纳过TA的回答
知道答主
回答量:126
采纳率:0%
帮助的人:74.4万
展开全部
我觉得是这个样子的: P是一个指向一位数组的指针,这个数组从0下标开始,p指向这个数组的首地址。当有p+1是,它指向该数组的下一行,也就是说此时 P的值为 P= P+1*(5*4),因为一般int是占四个字节 , 所以 P =0x0028ff00 + 20 =0x0028ff14 楼主不知道对不对,要是不对麻烦你告诉我下正确的。嘿嘿
更多追问追答
追问
我和你的理解是一样的。但是写代码实际操作的时候,并不是如此。p指向二维数组没有问题,反而指向一维数组,就警告了。我用的开发工具是C-Free。是编译器的问题么
追答
可以这样理解下,(*p)[5] 在某些条件下,是可以和[][5]通用的, 所以  把一维数组 可以复制给一个指针   int b[5] ={1,2,3,4,5} ,*p =b;    但是要是想用指向数组的指针  要这么写   int b[][5] = (*p)[5];
P是一个指向一位数组的指针,它指的是一行一行的,不是某行里面具体的某个值,所以不能 赋值成 int b[5] = (*p)[5].
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
微点小呆
2013-08-07
知道答主
回答量:9
采纳率:0%
帮助的人:7.5万
展开全部
首先p是一个指针数组,并且能指向int型的数据,p数组的指向可以使一个int型变量,也可是使int型的数组,无论是一维还是二维。在c语言中,数组名代表该数组的首地址,若p的值是0x0028ff00,那么p+1应该是p[1]的地址,其值为0x0028ff00+sizeof(int)。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dreamonly0
2013-08-07
知道答主
回答量:58
采纳率:0%
帮助的人:20.1万
展开全部
一维数组,p指向数组的首地址。p+1即加了一个int长度,Int长度在不同的机器是可能存在差异的
更多追问追答
追问

为什么会有警告。当我定义一个二维数组后,让p指向二维数组,警告就没了,请解释现象,谢谢

追答
因为(*p)[5]本身就是一个数组,你如果将*p指向b那么就是同样内存的一维数组。现在的情况就好像是你把int a[5] = b一样,数组似乎没有这样的初始化方式,所以因为提示类型不匹配。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式