指针与数组的区别

以两个具体的例子说明指针和数组的区别,并在VS2008环境中进行验证。

例子1,如果一个文件file1.c中定义了一个全局数组char Array[2]={1,2},则Array是一个代表数组的首地址的标号(Label),此处假设为0x5000。在程序中所有使用Array的地方,用数组首地址来替换,例如Array[1]或*(Array+1)则取0x5000+1处的值。如果有整型指针pInt,且赋值pInt=Array,则等价于pInt=0x5000。此处pInt是指针的变量名,和数组标号Array不同,如果变量pInt的存储地址是pAddr中,则变量pInt的值即存放在pAddr中的值dAddr,而*pInt代表地址为dAddr处存放的值。为了在另外一个文件file2.c中获取此数组内第二个值,seadoncas尝试了下面几种方法,并通过VC验证各方法是否正确:

1) 在file2.c中使用extern char Array[]声明,然后使用Array[1]获取值,正确;

2) 在file2.c中使用extern char Array[]声明,然后使用*(Array+1)获取值,正确;或者在file2.c中定义一个char *pChar,pChar=Array,然后使用*( pChar +1)或者pChar[1]获取值,正确;

3) 在file2.c中使用extern char *Array声明,则无论使用Array[1]还是使用*(Array+1)均失败,程序中断执行。原因在于file2.c中认为Array是指针变量名不是数组标号,那么它会首先取地址为Array处所存放的值,即取Array数组的第一个值,然后file2.c再取这个值指向的地址处的值,因此程序崩溃,访问了内存保护区。

要点1:无论变量名还是数组名,在程序中均和某存储地址联系起来。不同点在于,变量名在程序中代表变量值,程序取的是变量所在地址处存放的值。对于数组名,程序取的是数组首地址值,但是如果把数组名当做变量名,程序取的是数组首地址所存放的值。

要点2:数组名代表数组首地址,可以把这个首地址赋给一个指针,利用指针进行数组取值和赋值操作,但是不能直接把数组名当成指针进行操作,因为指针操作是两步(取指针内容,取地址为指针内容的存储空间的值),数组操作只有一步(取数组首地址加适当偏移量后的地址处的值)。两步和一步操作也可以理解为,指针存储在地址pAddr1中,地址pAddr1中所存放的值是指针指向的地址dAddr1,dAddr1即数组名所代表的地址(数组名可理解为数组首地址的Label)。如果取数组第一个元素,指针操作第一步为取地址为pAddr1的存储区存放的值dAddr1,第二步为取地址为 dAddr1的存储区存放的值;数组操作仅有第二步,直接取数组名所代表的数组首地址处的值。

例子2: 在文件file1.c中定义了一个全局指针char *pChar并进行初始化(例如定义时即赋值为一个数组首地址。如果不初始化,对此指针进行取值操作,则指针默认值为0,对0地址进行取值程序会崩溃),同样进行如下操作:

 1) 在file2.c中使用extern char *pChar声明,然后使用*(pChar+1)或pChar [1]进行操作均正确。

 2) 在file2.c中使用extern char pChar []声明,然后使用*(pChar+1)或pChar [1]进行操作,程序不崩溃,但是结果均不正确。推测:pChar有个存储地址,其内存放pChar指向的地址。把pChar认为是数组名即不在把认为pChar当做指针变量,此时pChar=原指针变量pChar所在的地址=数组pChar[]的Label。进行数组操作*(pChar+1)或pChar [1],实质上取的是存放在地址为pChar的地址+1处的值,同样,数组操作*pChar或pChar [0]取的是存放在地址为pChar处存放的值,即指针pChar所指向的地址值。

要点3:一个文件中定义的全局指针变量,不能在另外一个文件中使用数组方式声明,否则依据数组操作,总是比指针操作少一步。

转载于:https://www.cnblogs.com/seadon/archive/2012/03/04/2379171.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值