C指针之二维数组的运算和指针

二维数组的运算和指针

指针指向二维数组的数组名

  • 二维数组的数组名表示二维数组的第一维数组中首元素(也就是第二维的数组)的首地址
  • 二维数组的数组名a等同于&a[0],这个和一维数组的符号含义是相符的
  • 用数组指针来指向二维数组的数组名是类型匹配的。
int a[2][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};

printf("a[1][3] = %d.\n", a[1][3]);
printf("a[1][3] = %d.\n", *(*(a+1)+3));

//int *p1 = a;		// 类型不匹配
//int **p2 = a;		// 类型不匹配

// 指针指向二维数组的数组名
int (*p3)[5];		// 数组指针,指针指向一个数组,数组有5个int类型元素
p3 = a;				// a是二维数组的数组名,作为右值表示二维数组第一维的数组
					// 的首元素首地址,等同于&a[0]
p3 = &a[0];

printf("a[0][3] = %d.\n", *(*(p3+0)+3));
printf("a[1][4] = %d.\n", *(*(p3+1)+4));

指针指向二维数组的第一维

  • 用int *p来指向二维数组的第一维a[i]
// 指针指向二维数组的第一维
//int *p4 = &a[0];		// 不可以
int *p4 = a[0];			// a[0]表示二维数组的第一维的第一个元素,相当于是
						// 第二维的整体数组的数组名。数组名又表示数组首元素
						// 首地址,因此a[0]等同于&a[0][0];

int *p5 = &a[0][0];	
printf("a[0][4] = %d.\n", *(p4+4));
int *p6 = a[1];
printf("a[1][1] = %d.\n", *(p6+1));

指针指向二维数组的第二维

  • 二维数组的第二维元素其实就是普通变量了(a[1][1]其实就是int类型的7),已经不能用指针类型和它相互赋值了。
  • 除非int *p = &a[i][j];类似于指针指向二维数组的第一维。

总结:二维数组和指针的纠葛,关键就是2点:

  • 数组中各个符号的含义。
  • 数组的指针式访问,尤其是二维数组的指针式访问。

猜你喜欢

转载自blog.csdn.net/baidu_41388533/article/details/106786596