在C中,您可以通过
声明一个char数组char []array;
或
char *array;
后一个是指针,为什么它可以是一个数组?
答案 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)
将按预期工作。
因此,下标运算符对指针和数组表达式的工作方式完全相同。但是,这并不意味着指针对象与数组对象相同;他们不是,任何声称不是的人都会感到困惑。