C语言数组与指针(二).pdf

C语言数组与指针(二).pdf

ID:48058204

大小:126.57 KB

页数:4页

时间:2019-10-16

上传者:无敌小子
C语言数组与指针(二).pdf_第1页
C语言数组与指针(二).pdf_第2页
C语言数组与指针(二).pdf_第3页
C语言数组与指针(二).pdf_第4页
资源描述:

《C语言数组与指针(二).pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

C语⾔数组与指针(⼆)数组与指针的纠葛在C语⾔中,根据定义,表达式e1[e2]准确地对应于表达式*((e1)+(e2))。因此,要求表达式e1[e2]的其中⼀个操作数是指针,另⼀个操作数是整数。且这两个操作数的顺序可以颠倒。故:a[4]等同于4[a]等同于*(a+4)*编译器把所有的e1[e2]表达式转换成((e1)+(e2))。所以,以下标的形式访问在本质上与以指针的形式访问没有区别,只是写法上不同罢了!多维数组⼆维数组a[i][j]编译器总是将⼆维数组看成是⼀个⼀维数组,⽽⼀维数组的每个元素又都是⼀个数组。多维数组定义的下标从前到后可以看做是最宏观的维到最微观的维。例:三维数组a[i][j][k]可理解为共有i个⼤组,每个⼤组⾥有j个⼩组,每个⼩组⾥有k个元素。所以:a表⽰为整个三维数组,其值为&a[0][0][0]&a+1为整个三维数组后⾯的第⼀个位置。(偏移整个三维数组的长度)a+1为第⼆个⼤组的⾸位置处(偏移⼀个⼤组的长度)【数组名a代表的是数组⾸元素的⾸地址,即:第⼀个⼤组的⾸地址】a[0]表⽰为三维数组的i个⼤组中的第⼀个⼤组【可看做⼀个⼆维数组】,其值与&a[0][0][0]的值相同。&a[0]+1为第⼆个⼤组的⾸位置处(偏移⼀个⼤组的长度)a[0]+1为第⼀个⼤组中第⼆个⼩组的⾸位置处(a[0]可看做是⼀个⼆维数组名,故其代表的是第⼀个⼩组的⾸地址)(偏移⼀个⼩组的长度)a[0][0]表⽰为第⼀个⼤组中的第⼀个⼩组【可看做⼀个⼀维数组】,其值与&a[0][0][0]的值相同。&a[0][0]+1为第⼀个⼤组中第⼆个⼩组的⾸位置处(偏移⼀个⼩组的长度)a[0][0]+1为第⼀个⼤组中第⼀个⼩组的第⼆个元素位置处(偏移⼀个元素的长度)a[0][0][0]表⽰为第⼀个⼤组中的第⼀个⼩组中的第⼀个元素。其值为&a[0][0][0],a[0][0][0]+1为⾸元素值加1。(因为a[0][0][0]为元素值⽽不是地址)数组的数组名(即:⼆维数组名)退化为数组的(常量)指针,⽽不是指针的指针。同理,n维数组名退化为n-1维数组的(常量)指针。【总结:指针代表的是谁的⾸地址就以谁的⻓度为偏移单位。】【规律:与定义⽐较,缺少⼏对⽅括号,就是⼏维数组的数组名,如上例:a缺少3对⽅括号,即为3维数组的数组名(代表的是2维数组的地址);a[0]缺少2对⽅括号,即为2维数组的数组名(代表的是1维数组的地址);a[0][0]缺少1对⽅括号,即为1维数组的数组名(代表的是数组元素的地址)】【数组名与整数相加,⾸先要转换成数组的⾸元素地址与整数相加,⽽⾸元素的存储⼤⼩就是相加的单位】 对多维数组的解析我们可以⽤上⾯那种从前到后的解析⽅式来思考,a:就表⽰整个多维数组。a[m]:就表⽰第m+1⼤组(⼤组即数组最⼤的维),a[m][n]:就表⽰第m+1⼤组中的第n+1⼩组。(⼩组即次⼤的维),以此类推,即多维数组的解析是层层细化的。指针数组与数组指针指针数组:⾸先它是⼀个数组。数组的元素都是指针。它是“存储指针的数组”的简称。数组指针:⾸先它是⼀个指针。它指向⼀个数组。它是“指向数组的指针”的简称。例:intp1[10];//它是指针数组。(因为[]的优先级⽐*⾼,p1先与[]结合,构成⼀个数组的定义)int(*p2)[10];//它是数组指针。(括号的优先级较⾼,*与p2构成⼀个指针的定义)它指向⼀个包含10个int型数据的数组。int(p)[10][5];//则p指向⼀个int型的⼆维数组a[10][5]。【规律:数组指针,把定义中括号内的指针看成是⼀个普通的字母,则其表⽰的就是数组指针所指的对象类型】inta[5][5];int(*p)[4];p=a;问:&p[4][2]-&a[4][2]的值为多少?设⼆维数组的⾸地址为0,则a[4][2]为第5组的第3个位置,因为inta[5][5];即有5组,每组有5个元素。故:&a[4][2]是(4*5+2)*sizeof(int)。int(*p)[4];指针指向⼀个含4个int型的元素的数组,故p[4]相对于p[0]向后移动了“4个int型数组”的长度,然后在此基础上再向后移动2个int型的长度(即,其步长按维度逐步递减,多维数组也可按此⽅式理解)。最后其值为(4*4+2)sizeof(int)最后切记:地址值参与的加减运算(地址不能被乘),整数的单位是地址值代表的元素的存储⼤⼩!&p[4][2]-&a[4][2]结果为-4。若分开⽐较&p[4][2]和&a[4][2]则相差4sizeof(int)个字节。数组参数与指针参数1、⼆维数组名做实参intmain(void){inta[4][5];………………fun(a);………} 被调函数:①fun(inta[4][5])②fun(inta[][5])③fun(int(*a)[5]){………a[i][j]=………………}以上三种⽅式皆可。⽆论是那种⽅式,它们只是写法不同,但编译器的处理⽅式相同,都把它们看做是⼀维数组指针。因为⼆维数组名退化为⼀个⼀维数组指针,故是以⼀维数组指针的形式来传递⼆维数组的。2、指针数组做实参intmain(void){inta[4][5],i,*p[4];for(i=0;i<4;i++)p[i]=a[i];………fun(p);………}被调函数:①fun(int*q[4])②fun(int*q[])③fun(int**q){………q[i][j]=………//取出指针数组中的第i个元素(为指针),再偏移j个单位………}以上三种⽅式皆可。⽆论是那种⽅式,写法不同,但编译器的处理⽅式相同,都把它们看做是⼆级指针。因为指针数组名退化为数组⾸元素的地址,即⼆级指针,故是以⼆级指针的形式来传递指针数组的。⽽多维数组名退化为次维数组的指针,即数组指针,故是以数组指针的形式来传递多维数组的。【C中函数实参与形参之间是传值引⽤的,所以你要改变实参的值,就传递它的地址】W3Cschool(www.w3cschool.cn)最⼤的技术知识分享与学习平台 此篇内容来⾃于w3cschool.cn⽹站⽤户上传并发布。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭