prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 6.2

Q但是我听说char a[]char *a.


A完全不是。 (你听说的与函数的形参有关;见问题 6.4。)数组不是指针,尽管它们密切相关(见问题 6.3)并且可以类似地使用(见问题 4.16.86.106.14)。

数组声明char a[6]要求为六个字符预留空间,它们将以“a”的名称命名。也就是说,有一个名为“a”的位置,其中可以存放六个字符。指针声明char *p,另一方面,请求一个用于存放指针的空间,它将以“p”的名称命名。该指针几乎可以指向任何地方:指向任何一个char,或指向任何连续的char数组,或指向空 [脚注](另见问题 5.11.30)。

和往常一样,一张图胜过千言万语。声明

	char a[] = "hello";
	char *p = "world";
将初始化可以表示成这样的数据结构


(这里未提供图片) 认识到类似 x 的引用[3]会根据 x 是数组还是指针而生成不同的代码。根据上面的声明,当编译器看到表达式a[3]时,它会生成代码,从“a”的位置开始,向后移动三个位置,然后获取那里的字符。当它看到表达式p[3]时,它会生成代码,从“p时,它会获取那里的指针值,向该指针加三,然后最终获取指针所指向的字符。换句话说,a[3]是对象 名为a(的起始位置)之后三个位置,而p[3]被指针p指向的对象之后三个位置。在上面的例子中,两者a[3]p[3]都恰好是字符 'l',但编译器到达的方式不同。(本质的区别在于,像a这样的数组和像p这样的指针的值在表达式中出现时,无论它们是否被下标引用,其计算方式都不同,具体解释请参见问题 6.3。)另请参阅问题 1.32

参考文献:K&R2 Sec. 5.5 p. 104
CT&P Sec. 4.5 pp. 64-5


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管