admin 管理员组

文章数量: 1087139


2024年3月14日发(作者:在线文档转普通文档)

2011年第2期 福建 电脑 163 

C语言中指针和数组区别的分析 

黄晓群 

(福建师范大学人民武装学院福建福州350007) 

【摘 要】:在c语言中,指针和数组即是难点也是重点,在这里通过指针和数组的区别来加深对他们 

的理解。 

【关键词】:指针 数组 c语言 

对于C语言编程新手来说.经常认为n数组和指针 在C语言中。我把地址形象地称为”指针”.把存放 

是相同的”。其实这种说法是不完全正确的,他们是有 地址的变量称为指针变量.通常我们把指针变量简称 

区别的。ANSIC标准6.542里建议: 

为指针。所以指针里存放的是数据的地址。而数组里存 

注意下列声明的区别: 放的是数据的值。 

extern int x: 

2.数组和指针的访问方式不同 

数组采用的是直接访问方式.而指针采用的是间 

extern int y[]; 

第一条语句声明x是一个int型的指针.第二条语 

接访问方式。 

句声明Y是int型.数组长度尚未确定.其存储在别处 

如:char a【6】=”China”; c=a【3】; 

定义 

程序编译时。给数组分配内存。如图: 

C l h l i l n I a I\0 

2000 +1+2 +3 +4 +5 …… 

标准里并没有做更细的规定.许多C语言书籍对 

数组和指针何时相同、何时不同也是含糊其辞一带而 

过。为了更好地理解指着与数组,在这里我们谈谈他们 

之间的区别。 

数组和指针的不同之处 

我们来看以下代码: 

ile1.fc 

假设编译器符号表给的一个地址是2000程序运 

行时,取3的值,将它与2000相加,取得(2000+3)的内 

容。在这里,每个符号的地址在编译时可知。因此。如果 

编译器需要一个地址来执行某个操作得花.它就可以 

int a[1O0]; 

直接地进行操作,并不需要增加指令取得具体的地址。 

相反,对于指针。它必须首先在运行时取得它的当前 

值,然后才能对它进行解除操作。 

立口:char p=”China”; c p『31; 

ifle2.c 

extern int a: 

编译器编译时。编译器符号表给了一个p,其地址 

程序编译时出错,在这里,数组a[1O0]与女a是两 

种不同的概念.以上的错误相当于把浮点型数据和整 

型数据混为一谈,如: 

ile1.fc 

匝Ⅱ工工丑 卫…・ 

5000+l +2 +3 +4 +5 

运行时,取得地址3000的内容,即5000,后与3相 

加,最后取(5000+3)的内容。 

数组和指针的不同点还在于:指针通常由于动态 

数据结构.而数组通常用于存储固定数目且数据类型 

ile2.fc 

extern char I: 

相同的元素;指针用malloc0、free0函数来动态分配空 

间或释放空间.而数组则隐式分配和删除;指针通常指 

向匿名数据,而数组自身即为数据名;等。 

从上面.我们可以很明显地看出int和char类型不 

二、数组和指针的相同之处 

数组和指针什么时候相同呢? 

匹配.同理指针和数组两种不同类型也是不匹配。 

下面我们来谈谈是数组与指针的区别: 

1.指针和数组保存数据的内容不同 

1.”作为函数参数的数组名”等同于指针 

rhe C Programming Language,第二版,Kemighan& 

164 福建 电脑 201 1年第2期 

Ritchie,第99页里指出: 

As format parameters in a function definition 

组的引用如ari1在编译时总是被编译器改写成 (a+i)的 

形式 C语言标准要求编译器必须具备这个概念性的 

行为。我们可以这么记着:方括号『]表示一个取下标操 

char sI] 

and 

char s: 

作符,就像减号表示一个减法运算符一样。取下标操作 

符就像取一个整数和一个指向类型x的指针.所产生 

are equivalent。‘・・・・ 

意思是:作为函数参数定义的形式参数,char s口和 

的结果类型是X.一个在表达式中的数组名于是就成 

了指针。 

char s是一样的 

在表达式中.指针和数组是可以相互替换的,因为 

在函数形参定义这个特殊的情况下.编译器必须 

把数组形式改写成指向数组第一个元素的指针形式。 

他们在编译器里的最终形式都是指针。并且都可以进 

在这里,编译器只向函数传递数组的地址,而不是整个 

行取下标操作 编译器可以自动把下标值的步长调整 

到数组的大小.如:long型数据的长度是4个字节.那 

数组的拷贝。因此以下几种: 

swap(int ptl・int pt2) 

f..…。】 

与 

么m[i1和m『i+1]在内存中的距离就是4,而不是1。在 

对起始地址执行加法操作之前.编译器会自动负责计 

算机每次增加的步长 这就是为什么指针总有类型限 

制的原因.每个指针只能指向一种类型的原因是:因为 

编译器需要知道对指针进行解除引用操作时应该取多 

少个字节.和每个下标的步长应取多少个字节 

三、总结 

swap(int ptl[1,int pt21]) 

【._…‘1 

与 

swap(int ptl[10],int pt21101) 

l-.…・】 

是一样的。 

总而言之。当声明时(除作为函数参数除外),指针 

所以主函数的参数中char料argv和char argv II[] 

和数组是不能替换的,如:nint all0]:”,只能用”extern a 

可以相互替换。 

『lo];”,而不能使用vleXtern a;n,又如"int af10 和”int 

2.”表达式中的数组名”就是指针.数组下标作为指 

a;”意义也是不同的:当作为函数参数或应用时,两者 

针的偏移量 

假设我们声明: 

int a[1 o], p,i_1; 

就可以通过以下任何一种方式访问a【i】; 

p=a;p【i]; 

是相同的,如:”a『i1=5;”等同于 (a+i)=5;”,又如,主函数 

的参数中char{ argv和char argv[]H可以相互替换。 

参考文献: 

【1】谭浩强,C程序设计(第三版)【M】,北京:清华大学出版社, 

2005 

或p=a; (p+i); 

或p=a+I; p; 

【2】E.Balagurusamy,标准C程序设计(第4版)[M】,北京:清华大 

学出版社.2008 

实际上,我们还可以采用其它更多的方法。对于数 

(上接第130页1 

【3】誊本饕, 序嘿计_基础 北市;高.等教育出雌社『M1,2OQ3 . 

②页面层:由Web页面组成,可以是以HTML、 

产品的各种信息进行Web挖掘、统计和分析,优化网 

ASP、JSP、ASPX、PHP等为扩展名的文件类型。 站的结构与内容、提供个性化的服务。首先,规范客户 

再通过数据挖掘技术提取相关信息,了解客户对 

③信息层:包含通过HTML文本分析器。从Web 

信息,

页面中分析出的”描述信息”、n链接信息”和”其他无关 陶瓷产品的需求倾向。其次,针对客户需求,规范陶瓷 

信息”等。这些”描述信息”是对链接信息的语义描述, 

产品的信息资源,为陶瓷企业的发展提供决策依据。 

可以把每个链接信息的”描述信息”看成是一段文本. 

因此,不同的链接都对应着不同的文本段。 

参考文献: 

1】朱焱,万维网资源质量模式挖掘技术分析,计算机科学, 

④知识层:是从大量的数字信息中挖掘出有用的 

信息,即陶瓷产品资源。信息层中得到的隐含模式X. 

2010年8月 

2]易斌,重视深网资源挖掘提升信息检索技能,现代情报, 

指导链接信息通过过滤器.从而分离出陶瓷产品资源 

2008年8月 

的地址,通过地址可以得到对应的陶瓷产品信息资源。 

[3]何玉香,曹丽颖,宋志恒,网络教育资源Web挖掘研究,天津 

⑤应用层:基于陶瓷产品资源之上的应用开发.可 

师范大学学报(自然科学版),2009年1月 

以是对陶瓷产品资源的标准化.也可以是对陶瓷产品 

[4蔡群力,基于web挖掘的教学资源搜索引擎的模型设计研 4】

资源的重新组织等方式 

究,福建教育学院学报.2008年7月 

四、结语 

【5】柳炳祥,李海林,刘锋,一种基于云理论的web日志定性规则 

Web挖掘技术从Web数据挖掘中挖掘出有意义 

提取方法,计算机应用与软件.2010年2月 

的规则和知识。本课题的研究可以通过对客户、服务、 


本文标签: 指针 数组 信息 编译器 地址