牛骨文教育服务平台(让学习变的简单)
博文笔记

C语言中二维数组和指针

创建时间:2017-02-05 投稿人: 浏览次数:797

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
",nums,nums[0],*nums,&nums[0]);
    /*第二行地址*/
    printf("%p,%p,%p,%p
",nums+1,nums[1],*(nums+1),&nums[1]);
    /*a[2][1]的值*/ 
    printf("%d,%d,%d,%d
",*(nums[2]+1),nums[2][1],*(*(nums+2)+1),*(&nums[2][1]));
    /*第一行第一列的值*/
    printf("%d,%d
",*(*nums),**nums);
    return 0;
}   
   &和*连用的时候是可以整体进行省略的
   &在二维数组中的含义是:地址升阶
   即&(第一列地址)--------->会将地址升阶成行地址
   *运算符在二维数组中的另外一种含义就是:地址降阶
   如:a+1代表第二行地址(行地址)
   *(a+1)代表的是(第二行第一列的地址)(列地址)
   *(a+1)+2代表第二行第三列地址,**
   其顺序是由(某一行地址--->某一行地址第一列地址---->某一行地址到具体列数的地址)
   即 行地址加指针指针运算符拿到的是列地址,列地址再加指针运算符拿到的是某一行某一列地址中的值;**
列地址加上一个取地址运算符&,就变成了行地址
%p是地址输出
printf("%p
",a[1]+2);
行地址也可以称为行指针
列地址也可以称为列指针

注意:二维数组中每一行的行地址和每一行第一列地址是一样的,但是其含义是完全不一样的,一个是行地址,没有进行降阶处理,而列地址是

二维数组的指针遍历方式:
1:下表发去遍历二维数组
2;列地址去遍历:
根据二维数组在内存中按行去连续分配内存空间的,所以可以通过列指针去遍历二维数组;

对于二维数组来说; 
    *a就是第一行第一列的地址*(a+0)+0;

代码能够run,如果有需要的话,可以直接拉下来run一下,看看结构体数组是怎么进行初始化操作和使用的。谢谢大家的访问,如有写的不好的地方,希望大家能够及时的提出来,谢谢观看

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。