C语言中二维数组和指针

来源:互联网 发布:花椒直播mac版 编辑:程序博客网 时间:2024/05/11 15:18

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一下,看看结构体数组是怎么进行初始化操作和使用的。谢谢大家的访问,如有写的不好的地方,希望大家能够及时的提出来,谢谢观看

1 0