先看一段代码:
#include <stdio.h>
int main() {
int matrix[2][5] = {{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10}};
printf("matrix=%p\t,matrix+1=%p\n", matrix, matrix + 1);
printf("matrix[0]=%p\t,matrix[0]+1=%p\n", matrix[0], matrix[0] + 1);
printf("*matrix=%p\t,*matrix+1=%p\n", *matrix, *matrix + 1);
printf("&matrix[0]=%p\t,&matrix[0]+1=%p\n", &matrix[0], &matrix[0]+1);
printf("&matrix[0][0]=%p\t,&matrix[0][0]+1=%p\n", &matrix[0][0], &matrix[0][0]+1);
printf("matrix[0][0]=%d\n", matrix[0][0]);
printf("*matrix[0]=%d\n", *matrix[0]);
printf("**matrix=%d\n", **matrix);
printf("matrix[1][1]=%d\n", matrix[1][1]);
printf("*(*(matrix+1)+1)=%d\n", *(*(matrix + 1) + 1));
printf("*((*matrix+1)+1)=%d\n", *((*matrix + 1) + 1));
return 0;
}
输出:
matrix=0061FEA8 ,matrix+1=0061FEBC
matrix[0]=0061FEA8 ,matrix[0]+1=0061FEAC
*matrix=0061FEA8 ,*matrix+1=0061FEAC
&matrix[0]=0061FEA8 ,&matrix[0]+1=0061FEBC
&matrix[0][0]=0061FEA8 ,&matrix[0][0]+1=0061FEAC
matrix[0][0]=1
*matrix[0]=1
**matrix=1
matrix[1][1]=7
*(*(matrix+1)+1)=7
*((*matrix+1)+1)=3
虽然数值上,matrix=matrix[0]=*matrix=&matrix[0]=&matrix[0][0],但是含义却不同。
1、matrix表示一个特殊的数组指针,数组中的每个元素又是一个数组,这个特殊数组含有2个元素,每个元素占用字节为BC-A8=14h=20,即4×5=20,matrix+1,则指针地址数值+20
2、matrix[0]表示一个普通的一维数组指针,数组中含有5个元素,每个元素占用4个字节,数组总长度为20个字节,matrix[0]+1,则指针地址值+4
3、*matrix=matrix[0]=&matrix[0][0]
4、matrix=&matrix[0]
5、遍历二维数组中每个元素,使用*(*(matrix+i)+j),i表示行,j表示列