C语言二维数组名的问题已定义int w[3][5],那*(*(w+1))为什么不是w[1][0]而是w[0][1]呢,w不是指向w[0]吗,那w+1不指向w[1]了吗还有*(w+1)[4]这个哪里不合法了,在*和[]同时用来表示一个元素时应该怎么用法

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/28 12:34:10
C语言二维数组名的问题已定义int w[3][5],那*(*(w+1))为什么不是w[1][0]而是w[0][1]呢,w不是指向w[0]吗,那w+1不指向w[1]了吗还有*(w+1)[4]这个哪里不合法了,在*和[]同时用来表示一个元素时应该怎么用法

C语言二维数组名的问题已定义int w[3][5],那*(*(w+1))为什么不是w[1][0]而是w[0][1]呢,w不是指向w[0]吗,那w+1不指向w[1]了吗还有*(w+1)[4]这个哪里不合法了,在*和[]同时用来表示一个元素时应该怎么用法
C语言二维数组名的问题
已定义int w[3][5],那*(*(w+1))为什么不是w[1][0]而是w[0][1]呢,w不是指向w[0]吗,那w+1不指向w[1]了吗
还有*(w+1)[4]这个哪里不合法了,在*和[]同时用来表示一个元素时应该怎么用法(比如(*w+1)[4]表示w[1][4]怎么来的).

C语言二维数组名的问题已定义int w[3][5],那*(*(w+1))为什么不是w[1][0]而是w[0][1]呢,w不是指向w[0]吗,那w+1不指向w[1]了吗还有*(w+1)[4]这个哪里不合法了,在*和[]同时用来表示一个元素时应该怎么用法
二维数组名是指定长度的一维数组的指针(常量指针),而一维数组本身是个指针,所以一般叫指针的指针,但其实有差异的.

w的类型是 int (*)[5]
*(*(w+1))等价于w[1][0],谁和你说不是?你如果怀疑自己做个测试不就完了.

w+1等价于&w[1]或w[1],类型 int (*)[5] 和w一样
*(w+1)等价于&w[1][0] ,类型 int * ,注意 w+1和 *(w+1)地址是一样的但是类型不同
*(*(w+1))等价于w[1][0]

*(w+1)就是在第二行地址,类型是int *,它是个整体,使用它当做一维数组读取必须加括号
正确的写法是:(*(w+1))[4]
如果不加括号意义就不同了,*(w+1)[4] 那就成了第二行第5个元素作为指针,但是实际上该元素是个整数,会造成非法地址访问.