设 int a[3][4]; ,则与元素a[0][0]不等价的表达形式是( )。
A.
*a
B.
**a
C.
*a[0]
D.
*(*(a+0)+0)
D太明显了,就是ABC不太懂,肯定是AB里选一个,但是我觉得A是等价的,不懂。求指点下ABC
这里* a 不等价,因为a是一个二维数组,可以想象成a是指向4个行指针的指针,对a取 * 相当于定位到了二维数组的第一行即等价于a[0],而非a[0][0]
对于D你知道是等价的,而0与任何东西相加都可省略,即等于答案B,所以既然你知道D正确,那B也正确。
对于C,因为a是二维数组,所以a[0]可以理解为拿到了第一行row=0的首地址,此时你理解成一维如tmp[]={1,2,3},那么* tmp就是取到了这个一维数组的第一个元素。相应的对于a[0]此时就相当于tmp,对其加 * 就相当于取到了第一行的第一个数,即C也正确
回答不易,求求您采纳点赞哦
与元素a[0][0]不等价的表达形式是D. ((a+0)+0), A. *a B. **a C. *a[0] 都是等价的,都指的是数组a的首地址。
因为a表示的是一个指向三行四列的二维数组的指针,A. *a B. **a C. *a[0] 表示的都是数组a的第一行的首地址,而 D. ((a+0)+0)表示的是数组a的第一行第一列元素的首地址。
int a[3][4],a是一个二维数组,它同时也是个二级指针
a的地址、a[0]的地址、a[0][0]的地址其实都相同
但是a,*a,**a的含义可是完全不一样的
星号是解地址,解一次地址和解2次地址显然意思是完全不同的
所以只看AB就能排除CD了
这里解一次地址其实是解成了一维数组,而不是数组元素
而BCD里要么含有2个星号,要么有下标取元素的操作,都是解2次地址