关于二维数组的取址符号&的理解。

int two(int k[][2])
{
cout<<"&k="<<&k<<'\t'<<"k="<<k<<'\n'; // A
}
int main()
{
int b[2][2]={{1,2},{3,4}};
two(b);
system("pause");
return EXIT_SUCCESS;
}
提问:问什么在A处的,&k与k输出的值不一样?还有&k是什么意思?
一,在main函数中加入这句话:cout<<"&b="<<&b<<"b="<<b<<'\n';
&b和b输出的值是一样,这样的输出结果和A处是不一样的。
二,在函数 int two(int k[][2])处,系统是否像为其他的二维数组那样为k[][2]开辟了一连串的内存空间;还是在此处k[][2]已经转变为指针变量k,系统只为它开辟了大小为4个字节的空间,用来接收实参传来的首地址?
三,对于b[2][2]来说,b应该表示是数组名,第0行地址,或首地址,而不是像 qmaoting 所说那样是首元素的地址吧??

最后也是最重要的,感谢各位的用心解答,非常感谢!

首先要明确一个概念,数组的首地址和首元素的地址虽然是相等的,但不是一样的

&b是数组的首地址,b是首元素的地址,所以他们相等

但在two()函数中b的数组首地址传给k那相当于指针k的值为b的数组首地址,但k本身有个地址(变量k的地址)所以&k是k的地址,而k是b的地址

你可以用VC++ 6.0调试看看:

①光标先停在“two(b);”那行,按F9设置一个断点,然后光标再停在“cout<<"&k="<<&k<<'\t'<<"k="<<k<<'\n'; // A”那行,按一下F9,再设置断点

②按F5,执行到第一个断点处

③在watch窗口中分别输入b、&b、k、&k,然后就能看到b和&b就如我前面所讲其实是相等的

④再按一下F5,执行到下个断点出,可以看到k和&k不相等,表明了数组的首地址和首元素的地址其实是不一样的

⑤不相信的话,你可以点开Memory监视器(按【Alt】+【6】),然后在Address处输入watch窗口中&k中的值,可以看到Memory窗口中,该地址其后的值为b的首地址(显示的可能有点乱,要看你的系统内存是大端还是小端模式,我的系统内存是小端模式,所以要从后往前两个字节两个字节地读)

C和C++的指针问题你还是专门找本书去研究吧
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-10-03
k和b作为数组,不带游标时,即指它们在内存中的首地址,而加上&也还是首地址。但由于two(b)的调用,使得b的首地址传给了k,所以在这里,k=b=&b为数组b的首地址,&k为数组k的首地址。
第2个回答  2010-10-03
就像int是一个值一样,指针也可以认为是一个值。既然是一个值,那么肯定就存在于内存的一个地点。这个这个地点的地址也是指针。
k就是二维数组的首地址,而&k是k的地址。
第3个回答  2010-10-03
程序跑起来以后(以linux举例子)系统会给这个程序分配4G的空间,0到1G为内核空间,后3G为系统空间,你申请一个变量,就在这个空间中,那么这个变量就有一段地址空间储存这个变量,这个地址就是&a的值。也就是说&a代表这个变量的地址值,a就为这段地址中的真实值。
相似回答