正文

数组与指针2009-02-26 10:48:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xman/41059.html

分享到:

  任何能由数组下标完成的操作也可由指针来完成,一个不带下标的数组名就是一个指向此数组的指针,在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 的内存示意图为:


(数组 arr 的内存示)

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

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

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

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

参考:

指针

A TUTORIAL ON POINTERS AND ARRAYS IN C

http://home.netcom.com/~tjensen/ptr/pointers.htm

阅读(2726) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册