浅析C指针和一维、二维数组之间的关系
2017-11-15张龙波
张龙波
摘要:指针是C语言的灵魂;熟练掌握指针的使用方法就可以直接操纵内存,使得程序的执行效率得到极大提高,从而我们可以编制出高效、简洁、优秀的指令代码。根据实践教学经验,仍有较多C语言学习者对指针和数组二者之间的关系掌握的不够清晰,下面力求通過最简洁、最高效的叙述方式,使大家耳目一新,豁然开朗!
关键词:指针;数组;数组指针;函数
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)28-0071-02
1 C指针和一维数组之间的关系
首先分析一维数组中每个数组元素在内存中的存储状态:假设有一整型数据类型的一维数组a,其定义及初始化语句如下:“int a[4]={-1,2,-3,4};”。其在内存中的逻辑状态存储示意图如下所示(以表格形式展示):
(各个数组元素值会从高字节地址到低字节地址、按其补码格式存入内存单元格)
因为普通的指针变量只能指向相同数据类型的普通变量!数组元素的本质就是一个一个的普通变量,所以我们可以定义一个整型指针变量p,让它指向数组a的第一个数组元素:int* p=&a[0];//或“int* p=a;”。至此,我们可以通过main1函数清晰、直观地观察到数组a中元素在内存中的存储状态。
这里需要强调的是数组名a是一个指针常量,其值是固定的,不可以修改(如上方表格中的一维数组名a等价于&a[0],等价于0x18FF1001),而p是一个指针变量,其值是可以修改的!如果代码中出现a++、++a、a—、—a都是错误的!
2 C指针和二维数组之间的关系
首先分析二维数组中每个数组元素在内存中的存储状态:假设有一整型数据类型的二维数组a,其定义及初始化语句如下:“int b[2][2]={{10,-20},{30,-40}};”。其在内存中的逻辑状态存储示意图如下所示(以表格形式展示,请注意,C语言编译器是按行逐一将元素在内存中存储表示的!):
前已叙述:普通的指针变量只能指向相同数据类型的普通变量!数组元素的本质就是一个一个的普通变量,所以我们也可以定义一个整型指针变量p,让它指向数组b的第一个数组元素b[0][0]:int* p=&b[0][0];//或“int* p=b[0];”//或“int* p=*b;”。
读者可能会提出为何“int* p=*b;”是正确的呢?因为*b是对b这个指针常量取内容的!所以*b的值就是b[0],而b[0]是指向其内部的2个元素对象的第一个元素对象b[0][0]的!(切记不可以写作:“int* p=b;”,因为b是一个指针常量,它指向其第一个数组元素b[0]、并不是指向数组元素b[0][0]的!)。至此,我们也可以通过如下的main2函数清晰、直观地观察到数组b中元素在内存中的存储状态。
3 “数组指针”和一维、二维数组之间的关系
以上两部分介绍的都是普通指针变量指向一维、二维数组中具体的数组元素时发生的关系,下面我们有必要讨论一种特殊的指针——“数组指针”,它和数组之间又会发生怎样的“化学反应”呢?(所谓数组指针就是专门用来指向数组的某行的指针!)
以上函数代码解释如下:
第1行的作用是:定义一个一维的整型数组a,并且对其6个数组元素进行初始化!
第2行的作用是:定义一个数组指针变量p,它是一个只能指向“包含有6个元素的一维数组”的指针变量!
第3行的作用是:让p去指向一维数组a的所有元素,即让p去指向一行数据!
第4行的作用是:打印出&a、a、&a[0]三个指针常量的值,可以发现它们是相同的!
第5、6行的作用是:利用数组元素名打印出所有元素值!注意:C在编译时会把a[i]转换为*(a+i)处理!
第8、9行的作用是:利用数组指针变量p打印出所有元素值!“(*p)[i]”的含义是:p所指向的行中序号为i的元素!
第10行的作用是:让p加1,p就一下子跳过了整个的一维数组中的所有元素!
第11行的作用是:观察p的值,发现p的值必定比&a[0]的值大0x18(即跳过了24个字节的单元格地址)!
main4函数的倒数第3行代码中的“*(p+i)+j”需要我们好好研究!“*(p+i)+j”指的是第i行第j列数组元素的地址!(由于p是指向行的数组指针变量,所以*(p+i)的作用就是“将第i行的行指针取星号降为指向b[i][0]的列指针”,“*(p+i)”再加上列控制变量j的值,即为元素b[i][j]所占内存字节的首地址!)
指针是C语言的特色及精华,其使用方法千变万化,需要我们所有喜爱C语言的编程人员更加深入透彻的学习!
参考文献:
[1] 黑马程序员[EB/OL].www.iqiyi.com.
[2] C语言从菜鸟到高手[EB/OL].www.bilibili.com.
[3] 谭浩强.C程序设计[M].4版.北京:清华大学出版社,2012.
[4] 明日科技.C语言从入门到精通[M].2版.北京:清华大学出版社,2011.
[5] Stephen Prata. C Primer Plus[M].6版.北京:人民邮电出版社,2015.endprint