C语言二维数组名的问题
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]怎么来的).
二维数组名是指定长度的一维数组的指针(常量指针),而一维数组本身是个指针,所以一般叫指针的指针,但其实有差异的.
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个元素作为指针,但是实际上该元素是个整数,会造成非法地址访问.大致我懂了,w+1等价于&w[1]我知道,但等价于w[1]有点不理解,w[1]应该是int *型吧,还是说w[1]和w+1只是地址相同但类型不同,还有下面的问题是(*w+1)[4]为什么是w[1][4]这么理解吧,w是一系列(一维数组地址)的集合的首地址,
w[1]是一个具体的一维数组首地址(指针,其类型是int (*)[5]),不是一维数组本身,就好比int *p=a,p是个一维数组的指针一样,你要取值必须用星号,因此*(w+1)才是用来取一维数组第一个元素地址的,相当于数组名写法就是 &w[1][0]。注意地址类型,别只看地址相同就认为是同一个概念。
就好比w的地址是数组的地址,W[0]的地址是第一行的首地址,他们都是相同的,但是w代表整个数组,W[0]只代表第一行。那(*w+1)[4]是啥(*w+1)[4]为什么是w[1][4]?这是错的。
w的类型是int (*)[5],那么 *w 的值是 int [5],也就是一个长度为5的一维数组,一维数组长度越界系统是不检查的,而int (*)[5]的列数系统会检查的。所以如果看成指针就是int *,也就是把二维数组转换成了一维数组指针来看待,然后+1,指向第二个元素,然再往后定位4个元素,(*w+1)[4]等价于(*w)[1+4]。