关于数组指针在二维数组中的应用

对于下面代码的输出结果:

#include 
int main() {
	int a[4][4] = { 0 };

	for (int i = 0; i < 4; i++) {          //0 1 2 3
		for (int j = 0; j < 4; j++) {      //1 2 3 4
			a[i][j] = i + j;               //2 3 4 5
		}                                  //3 4 5 6
//		printf("\n");
	}
	int(*p)[3] = a;
	printf("%d\n", p[2][3]);     //p[2][3]----->*(*(p+2)+3)

	printf("%d\n", &p[2][3]-&p[4][1]);

	printf("%p\n", &p[2][3] - &p[4][1]);
	return 0;
}

分析如下:

关于数组指针在二维数组中的应用_第1张图片

p是一个数组指针,指向元素大小为3个整型,而p[2][3]相对于*(*(p+2)+3),跳过两个为3个整型大小的元素,然后解引用,解引用的元素是一个存放3个整型的数组,然后对内部元素进行+3,由于二维数组是连续存放的,所以直接跳到下一个元素。

第二个打印结果为-4,由上分析可以得到两个指针指向的位置,两个指针相减得到的是中间相差的元素个数,低地址减高地址,所以为-4.

第三个打印结果就是-4的地址咯,-4在内存按补码存储,再转换成16进制就为fffffffc.

你可能感兴趣的:(C语言,算法,数据结构,c语言)