C指针之二维数组

二维数组

二维数组的内存映像

  • 一维数组在内存中是连续分布的多个内存单元组成的,而二维数组在内存中也是连续分布的多个内存单元组成的。

  • 从内存角度来看,一维数组和二维数组没有本质差别。
  • 二维数组int a[2][5]和一维数组int b[10]其实没有任何本质差别。我们可以把两者的同一单元的对应关系写下来。
    • a[0][0]     a[0][1]   a[0][4]     a[1][0]    a[1][1]      a[1][4]    
    • b[0]           b[1]       b[4]         b[5]        b[6]          b[9]
  • 既然二维数组都可以用一维数组来表示,那二维数组存在的意义和价值在哪里?
    • 二维数组a和一维数组b在内存使用效率、访问效率上是完全一样的(或者说差异是忽略不计的)
    • 在某种情况下用二维数组而不用一维数组,原因在于二维数组好理解、代码好写、利于组织。
  • 总结:
    • 我们使用二维数组(C语言提供二维数组),并不是必须,而是一种简化编程的方式。想一下,一维数组的出现其实也不是必然的,也是为了简化编程。

二维数组的应用和更多维数组

  • 最简单情况,有10个学生成绩要统计;如果这10个学生没有差别的一组,就用b[10];如果这10个学生天然就分为2组,每组5个,就适合用int a[2][5]来管理。
  • 最常用情况:一维数组用来表示直线,二维数组用来描述平面。数学上,用平面直角坐标系来比拟二维数组就很好理解了。
  • 三维数组和三维坐标系来比拟理解。三维数组其实就是立体空间。
  • 四维数组也是可以存在的,但是数学上有意义,现在空间中没有对应(因为人类生存的宇宙是三维的)。
  • 总结:
    • 一般常用最多就到二维数组,三维数组除了做一些特殊与数学运算有关的之外基本用不到。(四轴飞行器中运算飞行器角度、姿态时就要用到三维数组)

哪个是第一维哪个是第二维?

  • 二维数组int a[2][5]中,2是第一维,5是第二维。

  • 结合内存映像来理解二维数组的第一维和第二维的意义。
    • 首先第一维是最外面一层的数组,所以int a[2][5]这个数组有2个元素;其中每一个元素又是一个含有5个元素的一维数组(这个数组就是第二维)。
  • 总结:
    • 二维数组的第一维是最外部的那一层,第一维本身是个数组,这个数组中存储的元素也是个一维数组;
    • 二维数组的第二维是里面的那一层,第二维本身是个一维数组,数组中存的元素是普通元素,第二维这个一维数组本身作为元素存储在第一维的二维数组中。

二维数组的下标式访问和指针式访问

  • 一维数组的两种访问方式。以int b[10]为例, int *p = b;。
    • b[0] 等同于 *(p+0);  
    • b[9] 等同于 *(p+9);
    • b[i] 等同于 *(p+i)
  • 二维数组的两种访问方式:以int a[2][5]为例,(合适类型的)p = a;
    • a[0][0]等同于*(*(p+0)+0);  
    • a[i][j]等同于 *(*(p+i)+j)
int main(void)
{
	int a[2][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
	//int a[2][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
	
	int *p = a;		// 类型不匹配
	
	printf("a[1][3] = %d.\n", a[1][3]);
	printf("a[1][3] = %d.\n", *(*(a+1)+3));
	
	
	return 0;
}

猜你喜欢

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