十招编写更易维护的嵌入式代码
2038年问题

也谈数组与指针

风中纸页 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个数组元素类型所占空间的字节数。

我倒认为数组和指针的最大不同在于数组首地址是常量不可改变;而指针是可以随意修改的

如有错误,敬请指正。
 

  • 无匹配
foo 说:
2009年2月24日 06:25

你这种解释无法说明:sizeof(array)是整个数组的大小,而不是指针大小;更无法说明:&array得到的也是数组起始地址,而不是某个指针(即,你说的数组名)的地址。

Head_small
风中纸页 说:
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;
}

谢谢关注!


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter