C语言,一个关于数组指针的问题。
int(*p)[5];我知道p是一个指向数组的指针。我想问的是他指向一个什么样的数组,p指向一维数组,还是二维数组。为什么。如果p的的值是0x0028ff00,那么p+1...
int (*p)[5];
我知道p是一个指向数组的指针。
我想问的是他指向一个什么样的数组,p指向一维数组,还是二维数组。为什么。
如果p的的值是0x0028ff00,那么p+1的值是多少。为什么? 展开
我知道p是一个指向数组的指针。
我想问的是他指向一个什么样的数组,p指向一维数组,还是二维数组。为什么。
如果p的的值是0x0028ff00,那么p+1的值是多少。为什么? 展开
展开全部
根据解析规则,上述声明器解析为指向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;
}
展开全部
指向的二维数组: int z[ ][5];
如: int z[100][5];
可以 p=z;
如: 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] 是同一单元,
自已体会一下。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
想知道p指向什么样的数组,把p去掉,变成int (*)[5].这样可看出p指向的是一个一维数组。
另 p指向的内容是数组,所有p+1应该是0x0028ff00 + sizeof(int)*5
另 p指向的内容是数组,所有p+1应该是0x0028ff00 + sizeof(int)*5
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我觉得是这个样子的: 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].
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先p是一个指针数组,并且能指向int型的数据,p数组的指向可以使一个int型变量,也可是使int型的数组,无论是一维还是二维。在c语言中,数组名代表该数组的首地址,若p的值是0x0028ff00,那么p+1应该是p[1]的地址,其值为0x0028ff00+sizeof(int)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询