关于二维数组的取址符号&的理解。
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 所说那样是首元素的地址吧??
最后也是最重要的,感谢各位的用心解答,非常感谢! 展开
{
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 所说那样是首元素的地址吧??
最后也是最重要的,感谢各位的用心解答,非常感谢! 展开
4个回答
展开全部
首先要明确一个概念,数组的首地址和首元素的地址虽然是相等的,但不是一样的
&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++的指针问题你还是专门找本书去研究吧
&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++的指针问题你还是专门找本书去研究吧
展开全部
k和b作为数组,不带游标时,即指它们在内存中的首地址,而加上&也还是首地址。但由于two(b)的调用,使得b的首地址传给了k,所以在这里,k=b=&b为数组b的首地址,&k为数组k的首地址。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
就像int是一个值一样,指针也可以认为是一个值。既然是一个值,那么肯定就存在于内存的一个地点。这个这个地点的地址也是指针。
k就是二维数组的首地址,而&k是k的地址。
k就是二维数组的首地址,而&k是k的地址。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序跑起来以后(以linux举例子)系统会给这个程序分配4G的空间,0到1G为内核空间,后3G为系统空间,你申请一个变量,就在这个空间中,那么这个变量就有一段地址空间储存这个变量,这个地址就是&a的值。也就是说&a代表这个变量的地址值,a就为这段地址中的真实值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询