也谈数组与指针
风中纸页
posted @ 2009年2月05日 05:08
in 程序设计
, 1577 阅读
转贴请保留本文作者及文章地址
看到wangcong写了关于数组和指针的问题,也想偷偷说两句。
文中讲到“a仅仅是个名字,它并不是指向数组第一个元素的整型指针,也不是一个数组类型!更为关键的是,它在内存中根本就不存在!!”这一点不是那么苟同。
我的理解是数组名a是存在的,就是第一个元素的地址。而数组长度为编译器指明了数组成员,也就指明了每一个元素的地址。当编译器根据数组名a来访问地址时,就是首地址a[0]的地址;访问内容时,由于是一个连续地址的数组空间因此会访问整个数组的内容。(为什么会被识别成为数组空间还不清楚,猜想可能碰到有符号指向的地址就认为数组空间停止了吧,无论栈上还是堆上,已分配的变量是尽量连续的)
19: printf("%d\n", c[1]);
这一句其实就说明了数组和指针的不同之一:a[i]总是被编译器“翻译”成为*(a+1)这种形式,这里首先被承认的就是是a就是数组首地址,i偏移的就是i个数组元素类型所占空间的字节数。
我倒认为数组和指针的最大不同在于数组首地址是常量不可改变;而指针是可以随意修改的。
如有错误,敬请指正。
- 无匹配
2009年2月24日 06:25
你这种解释无法说明:sizeof(array)是整个数组的大小,而不是指针大小;更无法说明:&array得到的也是数组起始地址,而不是某个指针(即,你说的数组名)的地址。
2009年2月25日 04:56
我在上文中其实说的是:为什么会被识别成为数组空间还不清楚,猜想可能碰到有符号指向的地址就认为数组空间停止了吧,无论栈上还是堆上,已分配的变量是尽量连续的。
另外,请运行一下代码来确定关于数组名称及其地址的问题:
#include "stdio.h"
int main(void)
{
char a[10] = {0};
printf("%p\r\n",&a);
printf("%p\r\n",a);
printf("%p\r\n",a[0]);
printf("%p\r\n",&a[0]);
return 0;
}
谢谢关注!