C语言中指针与数组恩怨浅析.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言中指针与数组恩怨浅析

C语言中指针与数组恩怨浅析   摘要:在C语言中指针是教学中最大的难点,在学习初,尤其对数组和指针的相关语法感到非常“纠结”,常常一头雾水。那么,指针和数组到底有什么关系呢?在我们还不了解的时候,我们不防先这样告诉自己:“它们之间没有任何关系。”该文将帮助您辨明指针与数组之间的“思思怨怨”。   关键词:指针;数组;指向;常量;变量   中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2013)34-7795-02   在C语言中,指针和数组是两个密不可分的概念,所以在我们正确区分它们的恩怨纠葛之前,先要正确理解一下“指针”和“数组”的概念。   1 什么是指针   关于“指针”一词,在KR中是这样描述的:指针是一种保存变量地址的变量。所以一量说到“指针”,我们就很自然的想起“指针变量”,就要把它当作变量的意思。比如:char *p1;int *p2; float *p3;double *p4,这最基本的写法。但是,这只表示该指针指向某类型的数据,而不表示该指针的类型。说白了,指针都是一个类型:四字节无符号整数。   以C语言标准中最初出现“指针”一词的部分,有这样的一段描述:   指针类型(pointer type)可由函数类型、对象类型或不完全的类型派生,派生指针类型的类型称为引用类型。指针类型描述一个对象,该类对象的值提供对该引用类型实体的引用。由引用类型T派生的指针类型有时称为“指向T的指针”。从引用类型构造指针类型的过程称为“指针类型的派生”。这些构造派生类型的方法可以递归地应用。   解释一下上面的话,也就是说,指针类型不是单独存在的,而是依附于派生出它的基类型,也就是上面那段话中最关键的一句:“由引用类型T派生的指针类型有时称为‘指向T的指针’”,即可以有“指向int的指针类型”、“指向float的指针类型”等等。   既然“指针类型”也是类型,那么就该和基本数据类型中的int、float、double 一也存在该类型的变量,以及该类型变量所对应的值,即“指针类型变量”和“指针类型的值”。   2 C语言中数组值得注意的地方   什么是数组?大多数的教科书上是这样描述的:“数组是一组有固定数目的、有序的、相同数据类型的元素的集合。”但我想说两点,我所理解的数组。   1) C语方中只有一维数组,而且数组的大小在编译期就必须是一个明确的常量确定了下来。那你一定会问,那多维数组呢?其实,多维数据只是由一维数组“仿真”出来的。也就是说,数组的元素可以是任何类型对象,那么我们只要把一维数组中的每一个元素都定为另一个一维数组,那多维数组就被仿真出来了。   2) 要想操控一个数组,我们只要确定两件事,一是确定该数组的大小,二是获得指向该数组下标为0的元素的指针。有的时候,对数组的操作是靠下标运算来控制的,但这只是一个表面现象,实际都是通过指针进行的。也就是说,数组的下标运算等同于一个对应的指针运算,所以我们完全可以依据指针行为定义数组的下标行为。看来我们不能说“指针”和“数组”之间没有任何关系。但是,我依然要强调,指针就是指针,数据依就是数组。   3 指针和数组并不是相等的   是的,指针就是指针,数据依就是数组。它们并不是相等的。为了说明这个概念,请看下面的声明:   Int x[5];   Int *y;   x和y能互换使用吗?可以吗?它们都具有指针值,也就是说他们的值都是个地址,它们都可以进行间接访问和下标引用操作,尽管这样,答案仍然是,它们不能互换使用,它们存在着相当大的区别。   在这里,x的值是一个常量,指向存放数组x这段空间的起始位置。而声明指针变量时,编译器只为指针本身保留内存空间(32位系统下,永远占4个字节,其值为某一个内存的地址。)它并不为任何整型值分配内存空间,而且,在没有对其初始化之间,该变量并未被安排指向任何现有的内存空间。当然,如果它再是一个auto,它甚至于根本不会被初始化。   有了上面的定义,让我们来看看这几个表达式,看看它们是不是合法的:   *x 它是完全合法的;   *y 它是非法的,因为这是将访问内存中某个不确定的位置,计算机可没那么聪明;   y++ 它也可以通过编译;   x++ 它不能通过编译,因为x是数组名,数组名是一个常量,是不能进行自增自减运算的。   4 以指针的形式访问指针和以下标的形式访问指针   让我们举个小例子:Char *p=”abcdef”;对于这个定义,如果现在我想读取字符‘e’我们要怎么处理呢?有两种方法:   1) *(p+4):这是以指针形式来读取的,先取出p里存放的地址(假定地址是Ox1111ff00),加四个字符的偏移量,新地址应该是Ox1111ff04,然后

文档评论(0)

189****7685 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档