为什么pt+1[2]是将pt+1解释成一个数组名,然后取该数组的第三个元素,也就是pt[3]的地址。
时间: 2024-01-07 08:06:07 浏览: 67
在C语言中,[]运算符是具有“从左向右结合”的性质的,即先计算左边的表达式,然后使用该表达式的结果来计算[]中的表达式。因此,在表达式*(pt+1)[2]中,先计算了pt+1[2]这个表达式。
对于pt+1[2]这个表达式,它可以被解释成*(pt+1+2),因为[]运算符可以被转换为*运算符和+运算符的结合。在这个表达式中,pt+1表示将pt指针向后移动一个int[3]类型的内存空间,即指向a数组的第二行;接着,+2表示将该指针再向后移动两个int类型的内存空间,即指向a数组的第四行的起始地址。最后,[]运算符将pt+1+2解释成一个数组名,即pt[3],该数组的类型为int[3],表示a数组的第四行。因此,*(pt+1)[2]实际上是对a数组的第四行进行了访问,而不是对a数组的第二行第三个元素进行了访问。
相关问题
若有下列定义和语句,则对a数组元素的非法引用是. int a[2][3], (*pt)[3]; pt=a; A. pt[0][0] B. *(pt+1)[2] C. *(pt[1]+2) D. *(a[0]+2)
非法引用是 B. *(pt+1)[2],因为 pt 是一个指向 int 数组的指针,而数组 a 是一个二维 int 数组,因此 pt 指向的是 a 的第一行。*(pt+1) 指向 a 的第二行,但是由于优先级关系,*(pt+1)[2] 实际上等价于 *(*(pt+1)+2),也就是访问第二行第三个元素,但是 a 只有 2 行 3 列,因此这是一个非法的访问。
对于以下程序,能够正确表示二维数组 t 的元素地址的表达式是( )。 int main(void) { int k, t[3][2], *pt[3]; for ( k = 0; k < 3; k++) { pt[k] = t[k]; } return 0; } A. &t[3][2] B. *pt[0] C. *(pt+1) D. &pt[2]
正确表示二维数组 t 的元素地址的表达式是 `&t[0][0]`。在这个程序中,`pt` 是一个指向指针的数组,`pt[k]` 指向二维数组 `t` 的第 k 行的第一个元素。因此,`&t[0][0]` 就是 `pt[0]` 的值,也可以说是 `*pt[0]` 或者 `*(pt+0)`。选项 A 错误,因为 `t[3][2]` 超出了数组 `t` 的范围;选项 C 和 D 分别指向了 `pt` 数组的第二个元素和最后一个元素,与问题无关。
阅读全文