请各位大神帮我解答一下关于指针和数组的问题,具体请进
若有以下说明:int a[5][9];则下列选项中对数组元素a[i][j]的引用错误的有_______.(0<=i<4,0<=j<9)
A)*(&a[0][0]+9*i+j) B)*(a+i)(j) C)*(*(a+i)+j) D)*(a[i]+j)
上面是一道练习基础的题目,因为我的基本功有点不扎实,对*这个符号,特别无语,老错,B选项还好,我知道只是一个a的时候是数组首地址,然后地址加i,最后*,就是指针变量,但是ACD就。。。。。a[]是个变量,前面又加个*,我就不解了,请知道的各位同志能帮我分析一下个选项是什么意思么?最好是一步一步慢慢来,我好弱。。。。
[解决办法]
整理下:
排除后选项应为B,不过B的写法有点看不懂,不知道是不是你写错了。
首先你要知道:
1:对二维数组的理解要有行指针和列指针的概念。
2:a+i 和 &a[i]为行指针,&a[i][j]为列指针
3:行指针 + 1 移动一行,列指针 + 1移动一个元素
4:行指针前加*号过渡到列指针.
逐个分析:
A:在列指针的基础上偏移,&[0][0]理解为第0行第0列的元素地址,每加1就是偏移一个元素,+(9*i)偏移9*i即偏移i行元素个地址,+j偏移j个元素,最后加*也就是取到a[i][j]了.
C:a+i 为第i行的行指针 -> *(a+i) 加*变为列指针(i行0列),即由行取到元素级别了 -> *(a+i)+j 加上j即为偏移j个元素->*(*(a+i)+j) 再在最外面加*即为取该地址的值,也就是第i行第j列的元素a[i][j]。
D:*(a[i]+j)是由*(*(&a[i])+j)变形来的, &a[i]为第i行的行地址,加* =>*(&a[i])=>a[i]过渡到第i行第0列的列地址,再加上j即就是在第i行偏移j个元素,最后加*即取改位置的值,也就是a[i][j].