c语言指针与数组问题!

c语言指针与数组问题!inta[3][4]={{1,2,3,4},{4,5,6,7},{8,9,1,2}};int(*p)[4];//这个是什么意思?p=a;//这个什么... c语言指针与数组问题!int a[3][4]={{1,2,3,4},{4,5,6,7},{8,9,1,2}};
int (*p)[4];//这个是什么意思?
p=a;//这个什么意思?
展开
 我来答
CodeBlove
2016-08-31 · TA获得超过3364个赞
知道小有建树答主
回答量:936
采纳率:79%
帮助的人:249万
展开全部
这个问题关键在于理解指针为什么要有类型。其实不同类型的指针本质上都是一样的,即内存地址,地址本身是没有类型的,赋予指针类型的意义在于给出存储数据的字节宽度,也称数据对齐宽度。比如 int *pt,pt是一个整数指针,那么编译器便知道如果通过pt读取数据时需要一次读取4字节,因为那里存放着一个int。换句话说指针类型定义了数据访问时的字节长度。

int a[3][4]定义了一个固定长度的二维数组,其行宽为4列int,即4*4字节为一行,可见对齐宽度为16字节,也就是每16字节划分为一行;行数为3行。其中a代表了数组首地址,其类型为int (*)[4],地址类型中的长度参数([4])取自于数组定义,由编译器确定。数组定义中包含了维度信息和内存地址及其类型,当通过数组名访问元素时必须同时指定行列索引。

为了灵活高效地寻址,可以采用指针访问数组,那么指针类型必须和数组首地址匹配(一致),因此如此定义 int (*p)[4]。可以看出该定义与数组a的地址类型只是多了个p而已,也就是明确了指针名称。那么为什么编译器会将 int a[3][4]的地址定义为 int (*)[4]呢?

二维数组的指针,其运算的基本单位是行宽,因此二维数组的指针又称为行指针,假设a的首地址为1000,p指向a,当p++时地址值是增加了一行的宽度,也即加一后p的值为1016而不是1001也不是1004。因此int (*)[4]的含义为其数据宽度为4个int的指针,从而int (*p)[4]的含义为:p是一个指向行宽为4个int的指针,也即每个元素为4字节的int,而行总字节数为4*4=16。

解读此类定义时先从括号内开始,解读顺序为:括号内是个指针p,其括号右侧是数组长度,表明指针p指向的是一个含有4个元素的行,前缀(左侧)int定义了基本数据类型,即元素类型为int,那么行宽就是4个int组成,就是4*4字节。

说了一大堆,那么如果你看明白了,p=a就不用解释了吧(赋值a的地址)。
zhuimengA2012
2016-08-31 · 超过40用户采纳过TA的回答
知道小有建树答主
回答量:148
采纳率:100%
帮助的人:45.4万
展开全部
int (*p)[4]是一个定义数组指针;
p = a;是让这个指针指向a数组;
记住,要想用指针访问数组:
一维数组 -> 一级指针
二维数组 -> 数组指针
指针数组-> 二级指针
更多追问追答
追问
指针数组和数组指针?不一样么?
你最后写的记住里面的内容是什么意思啊?
还有,p=a这句,是地址传递给指针吧?而不是数值?
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
连睿子车雨灵
2019-03-13 · TA获得超过3849个赞
知道大有可为答主
回答量:3203
采纳率:25%
帮助的人:242万
展开全部
p[2]是合法的,因为a本身为一维数组,而p也是一维指针,所以这样没问题。p[2]相当于*(p+2),也就是a[2]。
但是q[2][3]是绝对错误的,因为b是一个二维数组,而q是一维指针,所以不能这样调用。另外,q=b也是错误的,理由同上,q=&b[0][0]就对了,你可以自己思考一下为什么。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2016-08-31 · TA获得超过139个赞
知道答主
回答量:135
采纳率:0%
帮助的人:42万
展开全部
定义一个指向数组的指针 并初始化指针的值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式