注册 登录
编程论坛 C语言论坛

关于二维数组指针的问题求教。

wj66 发布于 2019-09-04 16:23, 3377 次点击
1.在一维数组中a[1]是与*(a+1)等价的,这个很容易就能理解。
但是二维数组中,a[1]为什么与*(a+1)等价?   书上说a[1]编译时其实是换成*(a+1)进行编译的,
这在一维数组中很容易理解,但在二维数组中*(a+1)代表a[1]行地址?
在二维数组中,如果把a[1]当成一个数组,也很容易理解它是该行数组的首地址,
但剖根究底,它是如何代表a[1]行首地址的?在计算机内部它是怎么实现的?
2.二维数组a中,a+1和*(a+1)都是地址,这个怎么理解呢?
谢谢解答!
10 回复
#2
forever742019-09-04 16:47
在人这一辈子的学习过程中,不是什么都要理解,什么都能理解的。
平面几何是建立在几条公理基础上的----公理是不需要理解的。
你的问题,拟照此办理:对于二维数组a,运算符*的含义不是取目标,而是降低指针等级,这个是规定,不需要理解,OK?
是故,运算符*有的时候是乘法,有的时候是降低指针等级,有的时候是取目标,或者忠实但较生硬地表示为解除引用。

[此贴子已经被作者于2019-9-4 16:51编辑过]

#3
forever742019-09-04 16:55
等你学明白了以后再忘记我的说法----这个叫无招胜有招。
#4
wj662019-09-04 17:57
回复 2楼 forever74
谢谢您! 说实话第一次听说降低指针等级,更别谈理解了。
如果在二维数组中将a[1]理解为该行数组的首元素地址,
*(a+1)与其等价,书上内容也就能看懂了。
我是初学者,不知道哪些需要深挖,哪些超出能力范围。
所以我以为是自己哪块知识没翻清,别人点一下就通了。😁

#5
wj662019-09-04 18:23
回复 2楼 forever74
我刚才再细读了下书。请问前辈,降低指针类型意思是不是将原先的行指针a+1,转换为列指针,即*(a+1)的意思?
#6
rjsp2019-09-04 19:01
数组不是地址
#7
吹水佬2019-09-05 05:00
a是数组名,不是指针,用a来表达指针会变得复杂不易理解。
用指针来操作数组的数据可以这样:
#include <stdio.h>
int main()
{
    int a[3][3]={1,2,3, 4,5,6, 7,8,9};
    int *p, i,j;
    printf("整块处理\n");
    p = &a[0][0];
    for (i=0;i<6;++i)
        printf("%d ", *(p+i));
    printf("\n分块处理\n");
    for (i=0;i<3;++i)
    {
        p = &a[i][0];
        for (j=0;j<3;++j)
            printf("%d ", *(p+j));
        printf("\n");
    }
}



[此贴子已经被作者于2019-9-5 05:09编辑过]

#8
moc2019-09-05 08:16
回复 楼主 wj66
请思考一下一维数组int a[5]中a+1中的1代表什么;同理在二维数组int a[5][2]中a+1中1代表什么 . 如果能够明白这两个1代表什么,那么你的问题自然迎刃而解。
#9
lin51616782019-09-10 15:50
a[0] 等于 *a 这个只是语法糖
* 和 [] 互相无缝替换
能用*表达 全部可以转换为用[]表达
你不能用 * 和 [] 互相转换 理解什么东西 或者 不理解什么东西

#10
zhouaichun2019-09-10 16:19
不管是一维数组还是多维数组,数组名都指向数组的第一个元素的地址,可以把数组名理解成常量指针。从书中了解一下各元素在内存中的存储位置,对你分析上述问题是有帮助的。
#11
forever742019-09-10 17:01
我习惯上把指针叫做指针变量,而数组名一般当作指针常量处理----它是有类型的。

当然,这些说法都是变通,用于向初学者解释,深入学习以后应该回归它们的本身的定义,也就是忘记这些外在的解释。
1