二维数组,多维数组和指针间的关系

首先给大家介绍一下常见的指针

*和const 的顺序和对应汉字的顺序一样
const char *p1; 常量指针 指针的内容可以修改,但是指向的内容不能修改
char const *p2; 指针常量 指针的指向不能修改,但是指向的内容可以修改
~
(int *)a ; a以前可能不是一个整形指针,被强制转化为int型指针
int *a ; 定义一个指针,指向的数据为整型
~
int *a[5]; []的优先级高于 *,所以定义的是一个数组,里面存放的为int *型数据,即是一个指针数组
int (*a)[5]; ()优先级高于[],所以定义的是一个指针,指向一个由5个整形数据构成的数组

二维数组和指针

个人认为二维数组和指针的关系首先要记住一句话
指针变量的加减,是以指针所指向的类型空间为单位进行偏移
结合这句话和下面的表格 可以很好的理解二维数组和指针

定义一个二维数组 int a[3][4]
a指向a[0]这个一维数组
a[0]可以看做是一维数组的数组名
a[0]指向的是a[0][0]

内容指向+1后跨越的字节数
&a指向二维4*12B
a指向一维4*4B
&a[0]指向一维4*4B
a[0]指向int型数据类型4B

理解: 无论是几维数组,数组的名字表示指向降低一个维度的数组,每次增加一个 &向上提升一个维度 ,增加一个 []向下降低一个维度 ,所以才会使&a指向整个二维数组,&a[0]向上提升一个维度指向了一维数组。

只有了解了不同方式的指向才能搞懂二维数组用指针的表示方法

对a[m][n]的不同表示方法
表述方式理解
a[m][n]常规方法
*(a[m]+n)a[m]所指向的是int型数据单元,+n跨越n*4B,得到的是地址,需要解引用
* (*(a+m)+na指向的是一维数组,+m跨越m*16B,解引用后相当于a[m]

a所存放的是a[0]的地址,a[0]存放的是a[0][0]的地址,所以需要逐层解引用的到需要的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值