数组与指针

系统 1996 0

任何能由数组下标完成的操作也可由指针来完成,一个不带下标的数组名就是一个指向此数组的指针,在 C 语言中数组名就是数组的地址。当一个指针变量被初始化为数组名时,就说该指针变量指向了数组。

char str[20],*pstr;

pstr=str 等价于 pstr =&str[0] ; // 指针被置为数组第一个元素的地址

访问数组第 6 个元素: str[5],pstr[5], *(str+5),*(pstr+5)

值得注意的是 pstr 是一个可以变化的指针变量,因此 pstr++;++pstr; pstr+=5 都是正确的,而 str 是一个常数。因为数组一经说明,数组的地址也就被固定了,故 str++;++str; str+=5 都是错误的。

编译系统在处理 str[i] 时,实际上是将数组元素的形式 str[i] 转换为 *(str+i) ,然后再进行运算的。相应的引用二维数组 a[i][j] 则等价于 (*(a+i))[j] *(*(a+i)+j), 通常式子 *(a+i)+j 是用来计算元素所在内存地址,并不是它的内容。

int a[3][4]; // 二维整型数组

int (*p)[4]; // 整型指针数组

p=a;

p+1 不是指向 a[0][1] ,而是指向 a[1] 。这是 p 的增值以一维数组长度为单位。

假设是这么一个数组:  

int arr[20];

arr 的内存示意图为:

数组与指针

和指针变量相比, 数组没有一个单独的内存空间而存放其内存地址。即:指针变量 p 是一个独立的变量,只不过它的值指向另一段连续的内存空间;而数组 arr ,本身代表的就是一段连续空间。

如果拿房间来比喻。指针和数组都是存放地址。只不过,指针是你口袋里的那本通讯录上写着的地址,你可以随时改变它的内容,甚至擦除。而数组是你家门楣上钉着的地址,你家原来是“复兴路甲 108 号”,你绝对不能趁月黑天高,把它涂改为“唐宁街 10 号”。 

数组是“实”的地址,不能改变。当你和定义一个数组,则这个数组就得根据它在内存中的位置,得到一个地址,如上图中的“ 0x1A000000 ”。只要这个数组存在,那么它终生的地址就是这个值。

指针是一个“虚”的地址,可以改变地址的值。当你定义一个指针变量,这个变量占用 4 个字节的内存,你可以往这 4 字节的内存写入任意一个值,该值被当成一个内存地址。比如,你可以写入上面的“ 0x1A000000 , 此时,指针 p 指向第一个元素。也可以改为“ 0x1A000003 ”,此时,指针 p 指向第二个元素。

参考:

A TUTORIAL ON POINTERS AND ARRAYS IN C

数组与指针


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论