char a[]和char *a 的不同

来源:互联网 发布:牙签弩淘宝暗语 编辑:程序博客网 时间:2024/05/16 01:41

sizeof  的结果是不一样的。
数组是直接访问内存。
指针是间接访问内存。

当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针.

并非如此。(你所听说的应该跟函数的形式参数有关) 数组不是指针。 数组定义 char a[6] 请求预留 6 个字符的位置, 并用名称 ``a" 表示。也就是说, 有一个称为 ``a" 的位置, 可以放入 6 个字符。 而指针申明 char *p, 请求一个位置放置一个指针, 用名称 ``p" 表示。 这个指针几乎可以指向任何位置: 任何字符和任何连续的字符, 或者哪里也不指。

一个图形胜过千言万语。声明

    char a[] = "hello";    char *p = "world";

将会初始化下图所示的数据结果:

       +---+---+---+---+---+---+    a: | h | e | l | l | o |/0 |       +---+---+---+---+---+---+       +-----+     +---+---+---+---+---+---+    p: |  *======> | w | o | r | l | d |/0 |       +-----+     +---+---+---+---+---+---+

根据 x 是数组还是指针, 类似 x[3] 这样的引用会生成不同的代码。认识到这一点大有裨益。以上面的声明为例, 当编译器看到表达式  a[3] 的时候, 它生成代码从 a 的位置开始跳过 3 个, 然后取出那个字符. 如果它看到 p[3], 它生成代码找到 ``p" 的位置, 取出其中的指针值, 在指针上加 3 然后取出指向的字符。换言之, a[3] 是 名为 a 的对象 (的起始位置) 之后 3 个位置的值, 而 p[3] 是  p 指向的对象的 3 个位置之后的值. 在上例中, a[3] 和  p[3] 碰巧都是 'l' , 但是编译器到达那里的途径不尽相同。本质的区别在于类似 a 的数组和类似 p 的指针一旦在表达式中出现就会按照不同的方法计算, 不论它们是否有下标。