三维数组问题

flcnrcn 2018-11-27 05:44:09

int arr[2][3][5]={
{
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
},

{ {16,17,18,19,20},
{21,22,23,24,25},
{26,27,28,29,30}
}
};
int (*q)[2][3][5] = &arr;
printf("arr=%x q=%x",arr, q);


问题:为什么打印出来的arr和q的地址是一样的呢
...全文
215 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2018-11-28
  • 打赏
  • 举报
回复
3×5 不等于 2×3×5
flcnrcn 2018-11-28
  • 打赏
  • 举报
回复
引用 6 楼 真相重于对错 的回复:
[quote=引用 5 楼 flcnrcn 的回复:] [quote=引用 4 楼 自信男孩 的回复:] [quote=引用 3 楼 flcnrcn 的回复:] [quote=引用 2 楼 霸气侧漏de影子的回复:]int arr[2][3][5],定义一个int类型的三维数组,arr即为该三维数组的首地址; int (*q)[2][3][5],优先级为先()后[ ],所以是定义一个指针q,该指针指向一个维度为三维的int数组; q=&arr,则使q指向了arr这个数组,所以最后打印q和arr都是打印同一个三维数组的首地址。
数组名代表的是首元素的地址,很明显首元素是个二维数组(正如二维数组的首元素是个一维数组一样)不是三维,所以arr和&arr应该是不同的地址才对。[/quote] 建议实践一下,猜测是解决不了问题的。 &arr和arr只是类型不一样,即&arr + 1和arr + 1偏移的长度是不一样的,但地址是一样的。[/quote] 您好! 既然地址一样,那存在如下函数调用: void function(int a[2][3][5]); .............................. int arr[2][3][5] ={....}; int (*q)[2][3][5] =&arr; function(*q);----问题:既然地址一样为什么这里的实参不用q而用*q呢,这个*q的值是什么呢? [/quote] 类型不一样,一个是指向数组的指针,一个是数组。所以不能替换 ×q对这个指针解引用,是数组, [/quote] 您好!数组做函数参数时都被编译器解释为指针了。那定义如下指针:int (*p)[3][5] = arr; function(p);这里的实参为什么有p不用*p呢。
英雄@末路 2018-11-28
  • 打赏
  • 举报
回复
数组和指针在取地址符下操作不一样的。
定义int a[x] ,打印 a, &a是一样的。
定义int *a, 打印a , &a是不一样的。
作为参数传递时就要注意了
真相重于对错 2018-11-28
  • 打赏
  • 举报
回复
引用 5 楼 flcnrcn 的回复:
[quote=引用 4 楼 自信男孩 的回复:]
[quote=引用 3 楼 flcnrcn 的回复:]
[quote=引用 2 楼 霸气侧漏de影子的回复:]int arr[2][3][5],定义一个int类型的三维数组,arr即为该三维数组的首地址;
int (*q)[2][3][5],优先级为先()后[ ],所以是定义一个指针q,该指针指向一个维度为三维的int数组;
q=&arr,则使q指向了arr这个数组,所以最后打印q和arr都是打印同一个三维数组的首地址。

数组名代表的是首元素的地址,很明显首元素是个二维数组(正如二维数组的首元素是个一维数组一样)不是三维,所以arr和&arr应该是不同的地址才对。[/quote]
建议实践一下,猜测是解决不了问题的。

&arr和arr只是类型不一样,即&arr + 1和arr + 1偏移的长度是不一样的,但地址是一样的。[/quote]

您好!
既然地址一样,那存在如下函数调用:
void function(int a[2][3][5]);
..............................
int arr[2][3][5] ={....};
int (*q)[2][3][5] =&arr;
function(*q);----问题:既然地址一样为什么这里的实参不用q而用*q呢,这个*q的值是什么呢?
[/quote]
类型不一样,一个是指向数组的指针,一个是数组。所以不能替换
×q对这个指针解引用,是数组,
flcnrcn 2018-11-28
  • 打赏
  • 举报
回复
引用 4 楼 自信男孩 的回复:
[quote=引用 3 楼 flcnrcn 的回复:] [quote=引用 2 楼 霸气侧漏de影子的回复:]int arr[2][3][5],定义一个int类型的三维数组,arr即为该三维数组的首地址; int (*q)[2][3][5],优先级为先()后[ ],所以是定义一个指针q,该指针指向一个维度为三维的int数组; q=&arr,则使q指向了arr这个数组,所以最后打印q和arr都是打印同一个三维数组的首地址。
数组名代表的是首元素的地址,很明显首元素是个二维数组(正如二维数组的首元素是个一维数组一样)不是三维,所以arr和&arr应该是不同的地址才对。[/quote] 建议实践一下,猜测是解决不了问题的。 &arr和arr只是类型不一样,即&arr + 1和arr + 1偏移的长度是不一样的,但地址是一样的。[/quote] 您好! 既然地址一样,那存在如下函数调用: void function(int a[2][3][5]); .............................. int arr[2][3][5] ={....}; int (*q)[2][3][5] =&arr; function(*q);----问题:既然地址一样为什么这里的实参不用q而用*q呢,这个*q的值是什么呢?
自信男孩 2018-11-28
  • 打赏
  • 举报
回复
引用 3 楼 flcnrcn 的回复:
[quote=引用 2 楼 霸气侧漏de影子的回复:]int arr[2][3][5],定义一个int类型的三维数组,arr即为该三维数组的首地址;
int (*q)[2][3][5],优先级为先()后[ ],所以是定义一个指针q,该指针指向一个维度为三维的int数组;
q=&arr,则使q指向了arr这个数组,所以最后打印q和arr都是打印同一个三维数组的首地址。

数组名代表的是首元素的地址,很明显首元素是个二维数组(正如二维数组的首元素是个一维数组一样)不是三维,所以arr和&arr应该是不同的地址才对。[/quote]
建议实践一下,猜测是解决不了问题的。

&arr和arr只是类型不一样,即&arr + 1和arr + 1偏移的长度是不一样的,但地址是一样的。
flcnrcn 2018-11-28
  • 打赏
  • 举报
回复
引用 2 楼 霸气侧漏de影子的回复:
int arr[2][3][5],定义一个int类型的三维数组,arr即为该三维数组的首地址;
int (*q)[2][3][5],优先级为先()后[ ],所以是定义一个指针q,该指针指向一个维度为三维的int数组;
q=&arr,则使q指向了arr这个数组,所以最后打印q和arr都是打印同一个三维数组的首地址。
数组名代表的是首元素的地址,很明显首元素是个二维数组(正如二维数组的首元素是个一维数组一样)不是三维,所以arr和&arr应该是不同的地址才对。
爱摸鱼de老邪 2018-11-27
  • 打赏
  • 举报
回复
int arr[2][3][5],定义一个int类型的三维数组,arr即为该三维数组的首地址;
int (*q)[2][3][5],优先级为先()后[ ],所以是定义一个指针q,该指针指向一个维度为三维的int数组;
q=&arr,则使q指向了arr这个数组,所以最后打印q和arr都是打印同一个三维数组的首地址。
自信男孩 2018-11-27
  • 打赏
  • 举报
回复
建议将arr和&arr的地址打出来,就知道为什么arr和q的地址为什么一样了。&arr是数组的地址,而数组名就是数组的首地址。

69,382

社区成员

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

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