二维数组加&和不加&的区别???

疾似云流 2007-10-07 12:41:02
这是书上的一段代码,没有想明白。
int calender[12][31];
int (*monthp)[31];
for (month=calender; monthp<&calender[12]; monthp++)
{
//省略
}
calender是二维数组calender[12][31]第一行的首地址,calender也是指向行的指针啊,为什么for语句的一个表达式可以用calender赋值,第二个就要用&calender[12] ?
calender[12]和&calender[12]有什么区别?
...全文
294 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
quench 2007-10-12
  • 打赏
  • 举报
回复
首先,这段代码会发生越界错误,
int calender[12][31];
int (*monthp)[31];
for (month=calender; monthp <&calender[12]; monthp++)
{
//省略
}
---------------
应该是
for(month = calender; monthp < &calender[11];\ monthp++)

首先看下这样一个例子好了
int array[10];
int i;
int *pi;
那么我们这样写完全没问题 pi = array;//因为数组名代表数组的首地址,
如果这样写呢? pi = array[9];//array[9]是存放在数组中第10个元素的整形值, 这样写其实和 pi = i;犯了一样的错误.应该写成pi = &array[9];

回到楼主的问题 int calender[12][31];//一个有12个元素的数组,数组中每个元素是包含31个整型元素的数组.
int (*monthp)[31];//定义一个指向数组的指针,数组为含31整型的数组.
那么 calender[11];//取数组的第12个元素,这个值是一个(int [31])类型的东东,但是这里没有具体的数组名, 所以并不象上面的例子一样是个首地址,要获得这个地址必须加 &

再看看,要怎么使用monthp, 也就是对monthp进行解引用呢. 比如你要取这个值calender[11][30];
(*monthp)[30]//对吗? 应该没错.这里要注意+括号,因为[]的优先级高于*
先解引用(*monthp)我们得到的是一个 int [31]类型的东西,其实就是int *了, 再下来就好理解了对一个int 指针使用[],

0黄瓜0 2007-10-12
  • 打赏
  • 举报
回复
前面我说错了.犯了把数组名和指针等同的错误.

若有
int calender[12][31];

calender[1][3]的类型是int, 这个没得疑问,大家都知道
&calender[1][3] 的类型是int*
calender[2] 如果代码中出现这么一个,则它的类型为int[31] ,也就是类型是个31个元素的一维数组.
&calender[2] 得到一个31个元素的一维数组的指针,如果给指针加1,将跳过31个元素的内存.
int (*pa)[31];//定义一个31个元素的一维数组的指针
pa=&calender[2] ;
pa+1就得到了&calender[3]

calender比较蒙人.
pa=calender;//calender可以直接赋给一维数组的指针.但它本身不是一个指针.它的类型是int[12][31]
看个一维数组的例子:
int arr[10];
int * p=arr;//这里的arr实际的类型是int[10],而不是int*,之所以可以把arr赋给int*型的变量:是因为数组名本身代表的是一段内存的首地址,同时数组之间不可以直接用数组名完成整个数组的赋值.于是有了这个规定.好理解的写法应是:
int* p=&arr[0];


&calender,它的类型是个二给数组的指针.
int (*p2)[12][31];//定义一个二维数组的指针
p2=&calender ;
p2=p2+1;//跳过12*31个元素.


lostpaul 2007-10-10
  • 打赏
  • 举报
回复
calender 不应该是int *[31]的吗
  • 打赏
  • 举报
回复
......

我怎么就看不懂呢~
bendise 2007-10-10
  • 打赏
  • 举报
回复
这句的意思就是循环12个月
疾似云流 2007-10-07
  • 打赏
  • 举报
回复
for (monthp=calender; monthp<calender+12; monthp++)
这个语句编译的时候有错,提示“无法从“int [12][31]”转换为“int””
疾似云流 2007-10-07
  • 打赏
  • 举报
回复
试过什么?
我在VS里面调试了一下,但是他们都是指针,而且值都是一样,所以很难区分,只知道是一个类型问题。
iambic 2007-10-07
  • 打赏
  • 举报
回复
我说的是楼主。
iambic 2007-10-07
  • 打赏
  • 举报
回复
你有没有自己试过?
0黄瓜0 2007-10-07
  • 打赏
  • 举报
回复
&calender[12]得到的指针类型是个一维数组.如果给这个指针加1,它就跳过31个int的长度.
同时&calender[12]指向这个二维数组的尾部之后.

for (month=calender; monthp < calender+12; monthp++)//这样写也是可以的.

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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