我们都知道,当定义一个一维数组时候,一维数组的数组名相当于指向元素的指针变量,唯一的区别就是数组名不可重新赋值,而指针变量则可以。并且此地址即为数组首个元素的地址:
例子:
int main(int argc, const char * argv[]){
int chars[3] ={7,12,9};
int *p=chars;
int i;
for(i=0;i<3;i++){
printf("%p\n",p+i);
}
/*
0092F73C
0092F740
0092F744
*/
}
把上例子中的printf("%p\n",p+i); 更换成 printf("%d\n",p[i]);
打印结果:7,12,9跟数组下标访问元素很像
二维数组可以看作是元素是一维数组的一维数组,参考一维数组跟指针的关系,很容易得出二维数组名相当于是指向一维数组的指针变量,而二维数组的元素一维数组又是指向其内部元素的指针变量,故二维数组可以看做是二级指针变量。
二维数组跟指针怎么赋值那
int i,j;
int chars[3][5] = {1,2,3,4,5,6};
int (*p)[5] = chars;
//int *p = chars; //错误 chars是相当于指向指向一维数组的指针,p是指向int类型的指针,故不能赋值
for(i=0;i<3;i++){
for(j=0;j<5;j++){
printf("%p\n",p[i]+j); //遍历元素的地址 p[i]二维数组中各个一维数组的首个元素的地址 加+j就是一维数组中下一个元素地址
printf("%p\n",*p+i*3+j); //遍历元素的地址 *p是二维数组首个元素的地址,即首个一维数组的地址,即一维数组的首个元素的地址+j,同上道理,+i*3是因为每个一维数组3个元素,换一行首个元素地址*p就+3的行数倍
printf("%p\n",&p[i][j]); //类似数组操作 这三个打印的完全一样就是遍历每个元素的地址
}
}