C++以二维数组作为函数的参数(绝对会将你给讲明白的)

数组名和指针的含义

C++以二维数组作为函数的参数(绝对会将你给讲明白的)

  • 根据上述程序的运行结果分析
  • 数组名是数组首元素的地址
    • 一维数组的元素是单个的元素,数组名就是第一个元素的地址
    • 二维数组的元素是一维数组,数组名就是第一个元素的地址,第一个元素是一维数组,一维数组的地址就是一位数组中第一个元素的地址,所以二维数组的数组名在数值上和第一个一维数组的第一个元素的地址相同,但是实际意义不同

C++以二维数组作为函数的参数(绝对会将你给讲明白的)

  • 因为二维数组的第一个元素是一个一维数组,是一个值,就算用取值运算符“ * ”,也只是值为为0x01,即二维数组中第一个一维数组的第一个元素的首地址,但是数据类型是一个数组,不是一个整型,所以二维数组要进行两次取值运算符“ * ”
  • 这也就说明了为什么在声明二维数组的使用,一定要指明第二维的大小。

C++以二维数组作为函数的参数(绝对会将你给讲明白的)

方法一,使用数组下标符号"[]"传递二维数组

C++以二维数组作为函数的参数(绝对会将你给讲明白的)
C++以二维数组作为函数的参数(绝对会将你给讲明白的)

  • 在上述方法中,COURSE_N是已经声明的常量,不可以改动

使用行指针访问二维数组

  • 在开头就讲过将二维数组看成是一位数组,不过这个一维数组的元素又是一个一位数组

C++以二维数组作为函数的参数(绝对会将你给讲明白的)

  • 定义一个指针p,该指针的p的基本类型是一维数组
  • int (*p)[3]: 指针p,代表的是一个有三个元素的一维数组的地址
  • 注意:先运算int [3] ,再是声明指针*p

C++以二维数组作为函数的参数(绝对会将你给讲明白的)

  • 使用行地址访问二维数组的元素
  • (p+i):p表示第0行的地址,加上i,表示第i行的地址
  • *(p+i):表示第i行第一个元素的地址
  • *(p+i)+j:表示第i行的,第j个元素的地址
    • ( * (p+i) + j):表示第i行,第j个元素的值

C++以二维数组作为函数的参数(绝对会将你给讲明白的)

  • 使用行指针来将二维数组传为函数的参数

C++以二维数组作为函数的参数(绝对会将你给讲明白的)

  • p实际就是二维数组的数组名

通过行指针访问二维数组

  • 根据数组是连续存储的,即使二维数组即使在逻辑上是二维的,但是在实际存储上,仍旧是一维的,如下图

C++以二维数组作为函数的参数(绝对会将你给讲明白的)

  • 定义一个基本类型的指针:int *p
  • p指向的是二维数组的第一个一维数组的第一个元素,那么,通过加减操作可以访问所有的元素

C++以二维数组作为函数的参数(绝对会将你给讲明白的)

  • p = a[0]:p为第一行第一列的元素的地址
  • p + 1:第一行第二列元素的地址
  • p + 列数 j+ i:第j列的第i行的元素的地址
  • p + n * 列数 + m:访问的是位置为n行,m列的元素
    C++以二维数组作为函数的参数(绝对会将你给讲明白的)
  • 使用列指针进行二维数组的参数传递

C++以二维数组作为函数的参数(绝对会将你给讲明白的)

  • 实参为:数组名*