Q但是我听说char a[]与char *a.
A完全不是。 (你听说的与函数的形参有关;见问题 6.4。)数组不是指针,尽管它们密切相关(见问题 6.3)并且可以类似地使用(见问题 4.1、6.8、6.10 和 6.14)。
数组声明char a[6]要求为六个字符预留空间,它们将以“a”的名称命名。也就是说,有一个名为“a”的位置,其中可以存放六个字符。指针声明char *p,另一方面,请求一个用于存放指针的空间,它将以“p”的名称命名。该指针几乎可以指向任何地方:指向任何一个char,或指向任何连续的char数组,或指向空 [脚注](另见问题 5.1 和 1.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