问题引出:
一个2维数组board[3][3]
**(board+1)是指向哪个呢?
是board[1][0]还是board[0][1]?
答案是:board[1][0];
我是这么理解2维数组board[3][3] :一个2维数组里面有3个1维数组 ,每个1维数组中包含3个元素;多维数组a[i][j][k]可以这么理解:a[i][j][k]表示一个3维数组有i个2维数组,每个2维数组中有j个1维数组,每个1维数组包含k个元素。
源头: board,**(board+1)表示啥意思呢?
board是数组board[0]的地址,而不是一个具体元素的地址。
board+1相当于是地址加上一个一维数组长度(board+1相当于是第0行数组首地址 加上一个一维数组长度的地址):
假如还是int board[4][5],那么sizeof(board)=5*sizeof(int) 。
也就是说,board指向一个5 int长度一维数组的头指针地址,那么board+1,则在地址上board=board+sizeof(int)*5。
哦,那就是board[1]的头指针地址了。
所以**(board+1)=board[1][0];
渐进:“*board = &board[0];”
个人体会:
这里的*borad是数组board[0]中的具体元素的地址,(*board+1相当于是第0行数组首地址加上一个具体元素地址)
具体事例:“int array[3][4];int *ptr = array; ”这个是不对的。
ptr和array有不同的级别,ptr指针引用的地址包含一个int类型的值,而array引用一个地址,那个地址引用另外一个包含int类型值的地址。
arry比ptr多了一级。
那么,ptr需要一个*,以获取地址中的值,而arry需要2个*。
所以应该初始化:int *ptr=*arry; 或者 int *ptr =&array[0][0]; 或者 int *ptr = array[0]
附录: