在多维数组中越界(非最后一个数组元素),是否指向的是下一个数组的元素?


遇到如下复习题,要求*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 # include 
 2 
 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 017 }

输出如下:
*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.

是否可以说明,在多维数组中,数组下标越界,在一些情况下,自动指向了下一个数组的元素。