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

inttwo(intk[][2]){cout<<"&k="<<&k<<'\t'<<"k="<<k<<'\n';//A}intmain(){intb[2][2]={{1,2... 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 所说那样是首元素的地址吧??

最后也是最重要的,感谢各位的用心解答,非常感谢!
展开
 我来答
qmaoting
2010-10-03 · TA获得超过217个赞
知道小有建树答主
回答量:112
采纳率:100%
帮助的人:102万
展开全部
首先要明确一个概念,数组的首地址和首元素的地址虽然是相等的,但不是一样的

&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++的指针问题你还是专门找本书去研究吧
帐号已注销
2010-10-03 · TA获得超过192个赞
知道小有建树答主
回答量:332
采纳率:0%
帮助的人:211万
展开全部
k和b作为数组,不带游标时,即指它们在内存中的首地址,而加上&也还是首地址。但由于two(b)的调用,使得b的首地址传给了k,所以在这里,k=b=&b为数组b的首地址,&k为数组k的首地址。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
02230838
2010-10-03 · TA获得超过2067个赞
知道小有建树答主
回答量:759
采纳率:0%
帮助的人:1072万
展开全部
就像int是一个值一样,指针也可以认为是一个值。既然是一个值,那么肯定就存在于内存的一个地点。这个这个地点的地址也是指针。
k就是二维数组的首地址,而&k是k的地址。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友a3722676e
2010-10-03 · TA获得超过1216个赞
知道小有建树答主
回答量:957
采纳率:0%
帮助的人:869万
展开全部
程序跑起来以后(以linux举例子)系统会给这个程序分配4G的空间,0到1G为内核空间,后3G为系统空间,你申请一个变量,就在这个空间中,那么这个变量就有一段地址空间储存这个变量,这个地址就是&a的值。也就是说&a代表这个变量的地址值,a就为这段地址中的真实值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式