为什么char指针可以是C中的char数组

时间:2014-09-04 17:42:07

标签: c

在C中,您可以通过

声明一个char数组
char []array;

char *array;

后一个是指针,为什么它可以是一个数组?

1 个答案:

答案 0 :(得分:0)

指针和阵列是两种完全不同的动物;指针不能是数组,数组也不能是指针。

混淆来自两个概念,这些概念在大多数介绍性C语言中都没有得到很好的解释。

第一个是数组下标运算符[]可以应用于指针和数组表达式。表达式a[i]定义为*(a + i);您从i中存储的地址偏移a 元素并取消引用结果。

所以如果你声明一个指针

T *p;

并指定它指向一些内存,如此

p = malloc( N * sizeof *p );

您将获得以下内容:

        +---+
     p: |   | ---+
        +---+    |
         ...     |
        +---+    |
  p[0]: |   |<---+
        +---+
  p[1]: |   |
        +---+
         ...
        +---+
p[N-1]: |   |
        +---+

p存储数组的基址,因此*(p + i)为您提供存储在i 元素中的值(不是字节) )跟随那个地址。

但是,当您声明一个数组时,例如

T a[N];
你得到的内容如下:

        +---+
  a[0]: |   |
        +---+
  a[1]: |   |
        +---+
         ...
        +---+
a[N-1]: |   |
        +---+

只为数组元素本身预留了存储空间;没有为名为a的变量留出单独的存储空间来存储数组的基址。那么*(a+i)机制怎么可能起作用呢?

这给我们带来了第二个概念:除非它是sizeof或一元&运算符的操作数,或者是一个字符串文字用于初始化另一个数组ijn一个声明,一个< em>表达式类型&#34; N元素数组T&#34;将被转换(&#34;衰减&#34;)到类型为&#34的表达式;指向T&#34;的指针,并且表达式的值将是第一个元素的地址。阵列。

换句话说,当编译器在代码中看到表达式a时,它将用指向a的第一个元素的指针替换该表达式,除非a是操作数sizeof或一元&。所以a计算数组的第一个元素的地址,这意味着*(a + i)将按预期工作。

因此,下标运算符对指针和数组表达式的工作方式完全相同。但是,这并不意味着指针对象与数组对象相同;他们不是,任何声称不是的人都会感到困惑。