请教大神为什么*p占用空间大小为8个字节,而*p+1 指向数组中第二个元素3

hutianxiang2006 2018-08-19 02:37:33
int b[3][2]={1,3,5,7,9,11};
int i,j,(*p)[2];//定义一个指向有四个元素的一维数组的指针

for(p=b,i=0;i<3;i++,p++) //i用于计算行数
{
for(j=0;j<2;j++)
{
printf("%3d ",*(*p+j));//!!尤其注意,这里的p存储的是a行整体的地址,指向一维数组a[0]整体,而不是指向一个具体的值!
//*p的值取出来的值就是a[0][0]的地址,*p+j就是存储a[0][j]行的地址,
// *(*p+j)就是该地址指向的元素的值!!
}
printf("p=%x ",p);
printf("*p=%x ",*p);
printf("p占用空间大小为:%d ",sizeof(p));
printf("*p占用空间大小为:%d",sizeof(*p));
printf("\n");
}
printf("b占用空间大小为:%d\n",sizeof(b));
return 0;
...全文
645 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
只此冒泡君 2018-08-23
  • 打赏
  • 举报
回复
*p 指的是包含两个int的数组 你可以想象跟b 一样 所以两个int大小是8. *p同时指向数组的[0]位置,它 + 1 指向的是[1] 所以 *(*p +1) 是 3

其实你把*p 当成整体去看 就相当于 int (*p)[2] 就跟申请了一个int 数组一样 c[2] 你sizeof(c) 不就得到8 么, 同时c + 1 指向的不就是数组的第二个值么。
考拉一枚 2018-08-21
  • 打赏
  • 举报
回复
int (*p)[2]
类型
p int **
*p int*

所以sizeof(*p) 64位系统下 为8个字节,32位为4个字节
所以 *p+1 是下一个int的地址
赵4老师 2018-08-20
  • 打赏
  • 举报
回复
A[B]
*(A+B)
*(B+A)
B[A]
//以上四行等价

"abc"[1]
*("abc"+1)
*(1+"abc")
1["abc"]
//以上四行等价

A[0]
*(A)
0[A]
//以上三行等价
zhangchm2018 2018-08-19
  • 打赏
  • 举报
回复
引用 6 楼 zhangchm2018 的回复:

一维数组 int a[2];
数组指针 int (*p)[2];
所以,可以看成 a == *p,*p 就相当于一维数组的数组名,a[1] == a + 1 == *p + 1。


(*p)[2] 是数组指针, *p 指向的是一个含有 2 个 int 元素的数组,一个 int 占 4 个字节,两个占8个字节;
而理解上 * 和 [] 可以互换,所以 (*p)[2] 可以变成 p[][2],当成一个二维数组,p = b,所以 p == b[0] == &b[、][0],p 只占一个 int 字节,即 4。
输入错误,是 p == b[0] == &b[0][0]
zhangchm2018 2018-08-19
  • 打赏
  • 举报
回复

一维数组 int a[2];
数组指针 int (*p)[2];
所以,可以看成 a == *p,*p 就相当于一维数组的数组名,a[1] == a + 1 == *p + 1。


(*p)[2] 是数组指针, *p 指向的是一个含有 2 个 int 元素的数组,一个 int 占 4 个字节,两个占8个字节;
而理解上 * 和 [] 可以互换,所以 (*p)[2] 可以变成 p[][2],当成一个二维数组,p = b,所以 p == b[0] == &b[、][0],p 只占一个 int 字节,即 4。
黄小猛 2018-08-19
  • 打赏
  • 举报
回复
因为p里面保存着b[0]的地址,而b[0](也就是*p)里保存着b[0][0]的地址,所以*p的大小是两个int的大小,而因为*p里是b[0][0]的地址,所以*p+1也就保存了b[0][1]的地址,在经过间接运算符取出该地址保存的值,得出结果就是b[0][1]。
wxh200707020140 2018-08-19
  • 打赏
  • 举报
回复
*解引用,*p指向数组首地址,为啥它大小是8,我也理解的不是很透彻
hutianxiang2006 2018-08-19
  • 打赏
  • 举报
回复
引用 1 楼 wxh200707020140 的回复:
因为P是数组指针,*p是数组首个元素,*p+1,相当于移向下一个地址。


既然是首个元素为什么占用空间为sizeof(int)*2
hutianxiang2006 2018-08-19
  • 打赏
  • 举报
回复
wxh200707020140 2018-08-19
  • 打赏
  • 举报
回复
因为P是数组指针,*p是数组首个元素,*p+1,相当于移向下一个地址。

69,373

社区成员

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

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