C语言中char (*p)[] 和 char p[] 的区别解析

需积分: 1 10 下载量 30 浏览量 更新于2024-12-24 1 收藏 44KB DOC 举报
"关于char (*p)[] 和char p[]的问题" 在C语言中,指针和数组是两个非常重要的概念,它们之间的关系复杂且容易混淆。本文将详细讲解`char (*p)[]`和`char p[]`的区别,并澄清一些常见的误解。 1. `char (*p)[]` 这个声明定义了一个指向字符数组的指针`p`。这里的`(*p)`表示`p`是一个指针,而`[]`则表示`p`所指向的是一个数组。具体来说,`char (*p)[]`意味着`p`能够存储一个数组的首地址,这个数组包含的是字符类型的数据。当你使用`p+1`时,`p`会移动到下一个数组的位置,因为它的步长是`sizeof(char[10])`,即数组的总大小。在32位机器上,`sizeof(p)`通常是4个字节,这表示指针本身的大小,而不是它所指向的对象的大小。 2. `char p[]` 这个声明定义了一个字符数组`p`。在C语言中,数组名`p`实际上是一个常量指针,它总是指向数组的第一个元素。因此,`char p[]`表示`p`是一个不能改变的指针,它总是指向内存中连续的`n`个字符(这里假设`n`为数组的长度)。当你尝试对`p`赋值,比如`p = a`,实际上你是在将`p`设置为数组`a`的第一个元素的地址,而不是整个数组的地址。这通常会导致编译器警告,因为`p`应该是一个指向数组的指针,而不是简单的字符指针。 3. `&a` 取数组`a`的地址`&a`,会得到一个类型为`char (*)[10]`的指针,即指向含有10个字符的数组的指针。这个地址不同于`a`,因为`a`实际上代表的是数组的第一个元素的地址,而`&a`是整个数组的起始位置。`&a`和`p`类型匹配,可以消除前面提到的赋值警告。 4. 指向数组的指针与指针数组的区别 指向数组的指针,如`char (*p)[]`,是一个单一的指针变量,它指向一个完整的数组。而指针数组,如`char *p[10]`,是一个数组,其中每个元素都是一个指针,可以分别指向不同的字符。`sizeof(p)`在32位机器上是40,因为它是10个`char*`指针的总大小,而不是指向数组的指针的大小。 5. 总结 - `char (*p)[]` 是一个指向字符数组的指针,可以用来遍历整个数组。 - `char p[]` 是一个字符数组,其名称`p`等价于数组第一个元素的地址,不能用于指向其他数组。 - `&a` 是数组`a`的地址,类型为`char (*)[10]`,可以赋值给`char (*p)[]`类型的指针。 - `char *p[10]` 是一个指针数组,包含10个可以指向不同字符的指针。 理解这些基本概念对于深入学习C语言中的指针和数组操作至关重要。在编程时,一定要注意指针和数组之间的区别,避免因混淆而导致的错误。如果仍然感到困惑,建议查阅相关书籍或教程进行更深入的学习。