C语言称地址为指针,这样专门存放地址的变量就是指针变量。充分理解二维数组中的地址有利于运用指针的方式操作二维数组元素,也有利于应用指针变量操作二维数组元素。
1. 二维数组中的地址若有定义: int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; C语言指针视角理解数组中地址: 1.1 行首元素地址 C预言将上述数组看成含有a[0]、a[1]、a[2]3个元素的一维数组,则a[0]、a[1]、a[2]相当于三个一维数组的数组名,代表着对应行的行首元素地址。因此:a[0]等价于&a[0][0]a[1]等价于&a[1][0]a[2]等价于&a[2][0]行首元素地址加1则指向下一个元素,则:a[0]+1等价于&a[0][1]a[1]+1等价于&a[1][1]a[2]+1等价于&a[2][1]1.2 行首地址 a为数组名,是数组的首地址,也称为行首地址:a 对应第0行行首地址a+1 对应第1行行首地址a+2 对应第2行行首地址1.3 在VS环境中输出二维数组中的地址 从上图可以看出:a和a[0]的值是一样的,但代表的意义不同,a是第0行的行首地址,a[0]是第0行的行首元素地址。因此在这两个地址上加1输出的结果则是不同的,a+1是指向下一行的行首,移动了4*4个字节的位置,因此从地址上可以看出a+1比a多16;a[0]+1是指向下一个元素,移动4个字节的位置,因此a[0]+1比a[0]多4。 1.4 行首地址和行首元素地址的关系本质上C语言将行首地址当做了存放行首元素地址的存储单元的地址,因此对行首地址做间接运算就得到了行首元素地址:*a==a[0]*(a+1)==a[1]*(a+2)==a[2]请看下列程序加深理解: |
从1.4可知,当定义一个指向整型变量的指针引用二维数组的元素时,不能讲数组名赋值给这样的指针变量,必须给行首元素地址。 2.1 逐个输出二维数组元素2.2 分行逐个输出各个元素 |