C语言中二维数组和指针
二维数组的地址表示方式
如数组:int a[3][3] = {1,3,5,7,9,11,13,15,17};
等价于:int a[3][3] = {{1,3,5},{7,9,11},{13,15,17}}
注意:
每一行都对应一个行地址,二维数组的地址就是第一行地址
二维数组名字本来就是地址即:
行地址:
a是第一行地址
a+1是第二行地址
a+2是第三行地址
列地址:
a[0]+0第一列地址
a[0]+1第二列的地址
a[0]+2第三列的地址
具体项目地址如:
a[1][2]的地址:为以下三种表示方式
1. a[1]+2;
2. *(a+1)+2
3. &a[1][2]
a[1][2]里面的值:为一下三种表示方式
4. *(a[1]+2)
5. ((a+1)+2)
6. a[1][2]
a[]或(a+1)//行地址
a[]+i //行地址加列地址
Test代码如下所示:
#include<stdio.h>
int main(void){
int nums[3][3] = {1,3,5,7,9,11,13,15,17};
/**第一行地址*/
printf("%p,%p,%p,%p\n",nums,nums[0],*nums,&nums[0]);
/*第二行地址*/
printf("%p,%p,%p,%p\n",nums+1,nums[1],*(nums+1),&nums[1]);
/*a[2][1]的值*/
printf("%d,%d,%d,%d\n",*(nums[2]+1),nums[2][1],*(*(nums+2)+1),*(&nums[2][1]));
/*第一行第一列的值*/
printf("%d,%d\n",*(*nums),**nums);
return 0;
}
&和*连用的时候是可以整体进行省略的
&在二维数组中的含义是:地址升阶
即&(第一列地址)--------->会将地址升阶成行地址
*运算符在二维数组中的另外一种含义就是:地址降阶
如:a+1代表第二行地址(行地址)
*(a+1)代表的是(第二行第一列的地址)(列地址)
*(a+1)+2代表第二行第三列地址,**
其顺序是由(某一行地址--->某一行地址第一列地址---->某一行地址到具体列数的地址)
即 行地址加指针指针运算符拿到的是列地址,列地址再加指针运算符拿到的是某一行某一列地址中的值;**
列地址加上一个取地址运算符&,就变成了行地址
%p是地址输出
printf("%p\n",a[1]+2);
行地址也可以称为行指针
列地址也可以称为列指针
注意:二维数组中每一行的行地址和每一行第一列地址是一样的,但是其含义是完全不一样的,一个是行地址,没有进行降阶处理,而列地址是
二维数组的指针遍历方式:
1:下表发去遍历二维数组
2;列地址去遍历:
根据二维数组在内存中按行去连续分配内存空间的,所以可以通过列指针去遍历二维数组;
对于二维数组来说;
*a就是第一行第一列的地址*(a+0)+0;
代码能够run,如果有需要的话,可以直接拉下来run一下,看看结构体数组是怎么进行初始化操作和使用的。谢谢大家的访问,如有写的不好的地方,希望大家能够及时的提出来,谢谢观看