人生第一博-C语言学习之多维数组的我的一点见解.

     说点开篇话,本人今年大2.统计专业.大1上学期有开过C语言课程.不过刚开始,对这方面没多大兴趣,所以整学期的课除了前几节基本逃了,期末考试用几天狂啃混过.但后来发现对这方面来兴趣了.所以,从这学期开始,开始买书认真啃起来.这阵子在读<c和指针>,读到多维数组的指针表示部分.觉得很值得深入思考.一方面很多人说指针是C精髓,也是难点.而且朋友也问过一些这方面的问题.我觉得有必要把自己的见解写下来,一则抛砖引玉,二则留下点学习印记,与人分享.助人也促己,何尝不是件好事.顺便说点题外话.<C和指针>这本书真的很不错,启发了我很多思考,让我对C理解得更多,也觉得自己对C掌握得太少.


  好,人生处女博开篇话说完.进入正题.
 

  关于多维数组的一些基本知识点不说,本文着重说用指针访问元素的问题.
  多维数组名是一个指向数组的指针!开宗明义.很多人都知道的一点.举个例子来说:
   int m_arr[3][7];
  这个声明语句(广义的声明)告诉我们定义了一个3行7列(goto 文末注)的多维数组,里面装的都是整型数据.数组名m_arr是一个指向"装有7个int型元素的数组"的指针.对它进行间接访问操作(*)后,得到"装有7个int型元素的数组".请注意,此处推理我们完全按照标量(关于C中标量定义请去google或baidu)的模式:一个指向某标量a(int类型)的指针,那么*a就是标量a的内容.这种移植的推理是正确的,但是是在一个更广义的意义下,后面详叙.我们得到一个"装有7个int型元素的数组".但是情况复杂了.标量就是其内容,难道这里可以把"内容"的概念移植过来吗?不可以.现在要讲这个更广义的意义了.我们应该修正下内容的定义,让这个"内容"也适用于数组这种情况.我的理解是:进行间接访问操作,我们得到的是指针所指向对象的一个接口.不叫内容,我叫接口(想法来自函数.我们知道函数是一段执行某特定功能的代码封装起来.而函数名是接口.我们引用接口就相当于引用函数具体实现.这个封装的理念很伟大.面象对象的语言本质就是体现这个理念,题外话,不对请指正).那么,对一个标量,接口是本身.所以,这就跟之前说的符合了(间接访问一个指向标量的指针得到内容,内容就是标量本身).如果觉得不好理解我再举个例子.比如一个程序中,一行代码执行了一个功能.我们没必要把它封装进一个函数,也可以把它封装进一个函数取个名字(就是接口啦).那么访问它就可以直接敲下那行代码或是引用函数名(也是一行).那么,接口在这个例子里就是代码行本身. 对一个数组呢,还是上例:"装有7个int型元素的数组".这里接口怎么理解?不是整个数组,那是第一个元素吗(如果看到一个图例来辅助说明,会很容易这么想的)?不是!一个元素是一个标量,如果是得到这个元素那么就跟后面的元素就无关了,不能说是得到一个数组.回顾接口的定义,我们引用一个函数名是得到整个函数体,再深入意思是使程序流程从函数体第一句进入.那么此处,"装有7个int型元素的数组"是一个接口,得到这个接口就是得到进入这个数组的权力,可以逐一访问这个数组元素,那么很清楚了,用C语言来表示,这个接口是可以访问这个数组元素的指针!
    所以,*m_arr+i和m_arr+i都是指针运算.这样,其实我们可以把一维数组的下标引用等同于指针访问.即a[i]等同于*(a+i) 移植过来,即断言m_arr[i][j]可以表示成*(*(m_arr+i)+j).来剖析下,m_arr是指向数组的指针,所以对它加i就是进行调整后,让指针跳过i个数组的长度,指向序号为i的那行数组.注意,此时指向数组,我们应该把数组看成一个整体,或者就干脆说把数组看成是一个数组类型的变量,这样容易理解了吧.然后对m_arr+i进行间接访问操作,得到这个数组.上面分析过了,是得到一个接口,或说一个可以访问数组元素的指针,然后加j.即在这个数组内偏移j,指向某个元素位置.最后再间接访问得到接口,这个接口是这个位置存放的内容.
  

      希望对初学朋友有帮助,也请高手批评指正.

-------------------------------------------------------------------------------------------

                          copyleft@nasa4836   all lefts reserved
  

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值