永发信息网

C语言、二维数组指针中的 * 和 &

答案:1  悬赏:0  手机版
解决时间 2021-05-11 15:58
C语言、二维数组指针中的 * 和 &
我看的是谭的那本C,有书的可以翻下吧(没书的看我的叙述吧),244、245页,看的我很迷茫啊
1、对于二维数组a[3][4], a+i 和 *(a+i) 怎么会是一样的呢?书上的那种解释我觉得是在回避这个问题,按照他的说法—— a+1不是一个变量存储单元(这点我认同),就谈不上*(a+i)所指向的内容了.所以*(a+i)不是指向内容的,所以它就是地址了?这种逻辑明显是错的啊.
还有最重要的问题就是谭自始至终没有告诉我们这个“解引用操作符”到底是个什么东西,我知道他是把指针带到它所指向的变量,但是这个定义对二维数组不适用,所以它是错的. 我很想知道这个dereference是什么意思~能从构词法或者其它的什么形象的说说吗?谢谢
2、就是这个&符号的问题了,我觉得跟第一个是一样的,书上有一句话是说,&a[i]
和a[i]是一样的,同理&后面是应该跟一个变量名的,然后用这个来取它的地址,那么这里跟的是一个数组名,怎么理解呢?是不是说把数组名看成一个变量呢?
3、书上所讲的指向行的指针、指向列的指针到底是什么意思呢?看不懂
4、既然a+i=*(a+i),那么,可不可以从数学上推导出:*********(a+i)=(a+i) (任意个星号),如果上述推论是正确的话那么我们怎么得到a[i][0]呢?(我记得好像**(a+i)是等于a[i][0]的,所以才有这个疑问)
恳请大家帮助回答一下,或者我说的有什么不对的地方帮忙指出一下,谢谢了~~

最佳答案

要回答你的这个问题,不妨先根据你的问题先编写一段小的示例程序:
#include
#include
using namespace std;
int a[3][4];
int main(){
memset(a,-1,sizeof(a));
int i;
for( i = 0; i < 3; i++){
printf(&a[i][0] = %d\n,&a[i][0]);
printf(a + i = %d; *(a + i) = %d;\n,a + i,*( a + i));
printf(a[i] = %d; &a[i] = %d;\n,a[i],&a[i]);
printf(\n);
}
}
这段示例程序在我本地上运行的结果为:
&a[i][0] = 4214816
a + i = 4214816; *(a + i) = 4214816;
a[i] = 4214816; &a[i] = 4214816;
&a[i][0] = 4214832
a + i = 4214832; *(a + i) = 4214832;
a[i] = 4214832; &a[i] = 4214832;
&a[i][0] = 4214848
a + i = 4214848; *(a + i) = 4214848;
a[i] = 4214848; &a[i] = 4214848;
我想看到这个运行结果,你已经有所了解了,下面我再详细说一下:
指针量a作为一个二维数组的指针量,其本质是一个“指向指针的指针”(为了方便,下面称其为双重指针),或者你可以理解为a为int**类型的指针量.当a做加减运算时,得到的结果仍然是一个“双重指针”,即a + i是一个双重指针,它是一个指向了原数组第i行的起始位置的双重指针.
而*(a + i)原来的双重指针解引用后得到的一个指针变量,他是一个指向了原数组第i行的起始位置的“单重指针”.
可以看出,a + i和*(a + i)尽管数据类型不同(前者为双重指针,后者为单重指针),但是他们指向同一块内存地址,因此作为指针量,他们的值是相等的.注意,仅仅是说,他们的值在数学上是相等的,并非说“他们是等价的”.
你的第二个问题亦是同理:
首先,[]作为C语言的操作符,本身即具有“解引用”的语义.明白的说,就是a[i]与*(a + i)是完全等价的,而&a[i]即等价于a + i.由于易知a + i和*(a + i)在数值上相当,那么进行等价带花可以知道,&a[i]和a[i]在数值上相等.当然,此处仍非等价关系.
至于指向行的指针,所指的就是指向行首位置的指针量.
至于你的最后一个问题,正如我刚才一直强调的那样,等号两端仅仅是数值上的相等,而非等价关系,因此无法按照你所设想的方式进行归纳推导.


我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
水煮鱼怎么做的啊
如果有人半夜打電話叫你上廁所, 你會怎麼樣?
我有个小女孩10月份出生 . 萌放在后边 谢谢各
福利彩票中奖的规则?
敏感性肌肤用什么化妆水能很好的清洁皮肤污垢
男中分适合什么脸型,什么样的脸型适合留中分
跪求大家帮忙,为什么这么难?
PDL的文件用什么工具能打开?
如何治好腰腿痛?
急!华硕F3B-F主板跳线接法?最好有图
地下城加点点加
艾青关于春天的诗歌,求一首关于春天美的诗歌
我和他没在一起以前话特别多,在一起之后却没
叶子喜欢什么
我是农历一九九一年二月十八早上五点钟左右出
推荐资讯
韩国十块 等于人民币多少?
我老婆有时三五个月才来月经,请问这样能怀孕
张杰谢娜梦幻诛仙8月6日电影院会上映吗啊
一道化学题~谢谢了^^
人生要如何过才过得有意义?
怎么能让皮肤变白? 最好是不用药
天气热的时候小孩子不想吃饭是怎么会儿事
ipad什麽时候在中国大陆上市?
游戏运行后自动消失
求冰封王座客户端!!
处暑祝福短信给客户,中秋祝福语
这样的主板,支持什么样的内存条
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?