在多维数组中越界(非最后一个数组元素),是否指向的是下一个数组的元素?
遇到如下复习题,要求*ptr,和 *(ptr+2)的值
int * ptr ;
int torf[2][2]= {12,14,16};
ptr = torf[0];
既然是二维数组,为了更直观可以写成
int torf[2][2] = {{12,14},{16,0}};
元素会从前往后,按要求的大小,依次分派给各个数组元素,如果不够则会用0替代。
ptr = torf[0], torf[0]的值是首元素的地址:该值为&torf[0][0], 那么*ptr = * & torf[0][0],*ptr = 12
那么*ptr+2, 则是*(torf[0]+2),即torf[0][2],但是2下标,代表的是数组中第三个元素。
因此输入如下代码,进行验算:
1 # include2 3 int main() 4 { 5 6 int * ptr ; 7 int torf[2][2]= {{12,14},{16}}; 8 ptr = torf[0]; 9 10 printf("*ptr = %d ,*(ptr+2) = %d\n",*ptr,*(ptr+2)); 11 12 printf("torf[0][0] = %d\ntorf[0][1] = %d\ntorf[0][2] = %d\ntorf[1][0] = %d\n",torf[0][0],torf[0][1],torf[0][2],torf[1][0]); 13 14 printf(" torf[0][0] = %p\ntorf[0][1] = %p\ntorf[0][2] = %p\ntorf[1][0] = %p\n",&torf[0][0],&torf[0][1],&torf[0][2],&torf[1][0]); 15 16 return 0; 17 }
输出如下:
*ptr = 12 ,*(ptr+2) = 16
torf[0][0] = 12
torf[0][1] = 14
torf[0][2] = 16
torf[1][0] = 16
torf[0][0] = 00000018aefff670
torf[0][1] = 00000018aefff674
torf[0][2] = 00000018aefff678
torf[1][0] = 00000018aefff678
torf[0][2]和torf[1][0]值相同,地址也相同。
数组的存储方式是连续的。
ptr = torf[0],那么指针+1,加上的是一个int字节,即4字节,那么加2,则是在地址上+8,由于数组存储的连续性,它指向了第二个数组的首元素16.
是否可以说明,在多维数组中,数组下标越界,在一些情况下,自动指向了下一个数组的元素。