鱼C论坛

 找回密码
 立即注册
查看: 4046|回复: 9

多维数组和指针

[复制链接]
发表于 2012-6-27 17:16:26 | 显示全部楼层 |阅读模式
2鱼币
int da[3][4];int a[4];
da + 1,指向哪里,
*(da + 1),指向哪里?
为什么?

最佳答案

查看完整内容

这里存在一个数组指针,到指针的类型变化过程。。。例如 int (*** p)[10]; * p 的类型是int (**)[10] , **p 的类型是 int (*) [10] , *** p 的类型是 int ()[10] 类型,C里面不存在这样的写法。。按我的理解int [10] 是数组类型,这就是为什么 对于一维数组,int a[10]; int * p =a ;这样的问题,sizeof(a) == 40; 那么为什么 p =a;这样可以赋值? 这里a 的类型就是 int [10] 类型的,p是int *类型。对于这个问题,我发 ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-27 17:16:27 | 显示全部楼层

这里存在一个数组指针,到指针的类型变化过程。。。例如 int (*** p)[10]; * p 的类型是int (**)[10]   ,
**p 的类型是  int (*) [10] , *** p 的类型是 int ()[10] 类型,C里面不存在这样的写法。。按我的理解int [10] 是数组类型,这就是为什么 对于一维数组,int a[10]; int * p =a ;这样的问题,sizeof(a)  == 40;  那么为什么
p =a;这样可以赋值? 这里a 的类型就是 int [10] 类型的,p是int *类型。对于这个问题,我发过帖子解释过,其他野有人解释过。。。这里空间有限,暂且不谈了。。。接上面*** p是int [10]类型,可以赋值给int *类型,也就是 你的 *(da +1)  ,da是int (*) []类型, *(da+1)也就是 int ()[]类型,也就是可以赋值给int *类型的。。。
不过你要理解这样的类型的转换过程,例如有数组 int a[10][10][10][10] ;   ***a,跟 int (***a)[10],***a;这两个完了类型是一样的。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-27 20:08:55 | 显示全部楼层
把da[3][4]看作是3个四元素的数组,da+1就是第二个数组的地址。*(da+1)是第二个数组首元素的地址,
二者数值相等。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-27 20:31:29 | 显示全部楼层
int da[3][4];int a[4];
da + 1  // da 是二维数组名  指向首地址  &da[0]    这是 da+1  就是指向了  二维数组的第一行的首地址
*(da + 1)  // 书上不是说过一句话吗?  上面 da+1 是 二维数组的第一行的首地址 加了 * 符号 就是 第一行 第一列的地址咯   行指针+*符号  就变为列地址    列指针+&符号 就变为行指针了 你没看到这句话过嘛
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 09:38:45 | 显示全部楼层


对于数组 da[3][4],为了让你看清楚,还是赋值你看下吧。

da[3][4] =
{
     {1,2,3,4},
     {5,6,7,8},
     {9,10,11,12}
}

所以这个二维数组包含三个数组元素,每个数组有4个元素,这个数组首地址是, &da[0][0],  也相当于da[0],  对于一维数组,
int a[10], a 相当于&a[0],  其实二维数组也可以看成一维数组的嵌套,就是数组的元素也是数组,所以da 相当于 &da[0],  但是你应该知道,一维数组 &a[0]的类型是 int *类型了,因为它的元素是 int 类型,但是 二维数组的元素是数组,所以&da[0] 的类型成了
int (*)[]类型,也就是数组指针类型了, 也就是da的类型是数组指针类型,那么da+1就很明显了,一个指针+1,就是加上它所指向的类型的长度,da是数组指针,da+1就是加上了第一行{1,2,3,4} ,这个数组的长度,这个数组是四个int类型 ,长度是16,所以da+1,就是da+16,其实。。。。da的值,跟数组的首地址是一样的,类型不一样。所以这个值在加上16.。数组的元素在内存空间都是连续存放,之间没有空隙。。。从第一元素到最后一个元素。所以这里da的值加了16以后,正好成了{5,6,7,8}这个数组的首地址,也就是元素 5或者 da[1][0] 的地址。。。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
丿夏夜灬彬刂 + 5 + 5 + 5 很给力!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 09:42:29 | 显示全部楼层
刚才没说完,不小心发表了,da+1的值是跟5或者da[1][0]的地址是一样的,但是类型坚决不一样,因为我之前说了da的类型是int(*)[]类型,所以da+1的类型也是数组指针,*(da+1) 的时候取值符号,这样da+1的类型就成了int *类型,这样才是5或者da[1][0] 的地址,类型一样的。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 09:46:07 | 显示全部楼层
Tzdner_C 发表于 2012-6-28 09:42
刚才没说完,不小心发表了,da+1的值是跟5或者da[1][0]的地址是一样的,但是类型坚决不一样,因为我之前说了 ...

必须顶 还得在扯几个字才能够字符
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-29 12:19:00 | 显示全部楼层
玩酷子弟lv 发表于 2012-6-27 20:08
把da[3][4]看作是3个四元素的数组,da+1就是第二个数组的地址。*(da+1)是第二个数组首元素的地址,
二者 ...

把da[3][4]看作是3个四元素的数组, 是什么意思,是不是将 da看成 是3个元素的数组,每个元素又是具有4个整形元素的数组?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-29 12:21:06 | 显示全部楼层
丿夏夜灬彬刂 发表于 2012-6-27 20:31
int da[3][4];int a[4];
da + 1  // da 是二维数组名  指向首地址  &da[0]    这是 da+1  就是指向了  二 ...

哪里有这句话,“ 行指针+*符号  就变为列地址    列指针+&符号 就变为行指针了 你没看到这句话过嘛”
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-29 12:30:09 | 显示全部楼层
Tzdner_C 发表于 2012-6-28 09:42
刚才没说完,不小心发表了,da+1的值是跟5或者da[1][0]的地址是一样的,但是类型坚决不一样,因为我之前说了 ...

首先,谢谢你的帮助,可是我还是不知道 “*(da+1) 的时候取值符号,这样da+1的类型就成了int *类型”,这句话的意思。你能再帮解释解释吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-13 22:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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