数组名是个常量指针(const pointer)? 你TM在逗我?数组名只是个名字,你能给它个类型? 像下面这些命题: 数组是指针 数组是指针常量 数组是常量指针 数组名是常量指针 数组名是指针常量 统统,统统都是错的。后两个是扯淡,变量名字也有类型??这些其实都是说的是数组,不管行为怎样令人迷惑,但都是说的数组,不应该有数组名是xxx这个说法。 说下性质: int a[10] = { 0 }; int * ptr = NULL; int * const cptr = NULL; // const pointer 在C语言中,数组和指针之间存在着密切的关系,但它们并不是完全相同的概念。数组是一种特殊的存储结构,而指针则是一种变量,用于存储内存地址。理解它们之间的关系有助于我们更好地编写和理解C语言程序。 让我们澄清一些常见的误解。数组名并不是一个常量指针,尽管它们在某些方面表现得类似。例如,当你声明一个数组如`int a[10]`,数组名`a`实际上是表示该数组的首元素的地址,但它不是一个指针变量,不能被赋值或改变。因此,以下表述都是不准确的: - 数组是指针 - 数组是指针常量 - 数组是常量指针 - 数组名是常量指针 - 数组名是指针常量 数组的性质如下: 1. 数组是复合数据类型,其类型表示为`type[size]`。例如,`int a[10]`定义了一个包含10个整数的数组。 2. `sizeof(a)`返回数组`a`占用的总字节数,即`sizeof(int[10])`。 3. 当你对数组取址`&a`时,得到的是一个指向整个数组的指针,而不是单个元素的指针。这导致`&a + 1`的结果是数组的末尾之后的地址,增加的步长等于数组的总大小,即`sizeof(int[10])`。 `const pointer`是指向常量的指针,如`int * const cptr = NULL;`,它是一个不可变的指针,意味着你不能改变`cptr`所指向的地址,但可以通过它来修改所指向的值(如果值是可变的)。 数组和指针的相似之处在于,当数组作为函数参数传递时,通常会“降级”为指针,因为数组的名称在函数调用中会自动转换为指向数组首元素的指针。因此,以下函数声明是等价的: ```c void f1(int *a); void f2(int a[]); void f3(int a[10]); ``` 在函数内部,例如`f3`,可以使用`a += 10`来改变指针`a`的值,但这并不意味着数组的大小或位置发生了变化,而是指针变量`a`的值改变了。 数组和指针在解引用和索引操作中表现出一致性,如`*(a + 1)`和`*(ptr + 1)`,它们都指向数组或指针的下一个元素。然而,这种一致性并不意味着数组和指针是同一事物,因为数组本身是一个固定大小的、连续的内存区域,而指针只是一个存储地址的变量。 虽然数组和指针在某些用法上具有相似性,但它们的本质区别在于: - 数组有自己的类型,如`int[10]`,而指针有自己的类型,如`int *`。 - 数组名不能重新赋值,而指针可以。 - 对数组进行算术运算(如加法)实际上是对数组首地址的运算,而不是改变数组本身的属性。 在深入研究C语言的细节时,有时会发现一些设计上的不完美之处,比如数组和指针的模糊边界。然而,了解这些基本概念和它们之间的差异是理解和使用C语言的关键。学习编译原理可以帮助进一步理解这些概念在底层是如何实现的。虽然C语言的抽象层次较低,但它的基础非常简单,一旦理解了数组和指针的关系,就能更好地驾驭这门语言。















- 粉丝: 8
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 船用低速机工程(一期)-气缸油膜厚度检测项目进展情况汇报.pptx
- 工程造价必备常识掌握路堤施工方法.docx
- 美国科特勒集团高级营销精英研修1.ppt
- 房地产销售培训手册.doc
- 操作系统实验报告(1)各种算法C++程序.doc
- 228句最常用英文口语短句文本.doc
- 从安客创投破产谈网站运营对平台的重要性.ppt
- 成都市某建筑公司工程劳务分包合同.doc
- 转盘钻孔机安全操作规程技术交底.doc
- 二次结构劳务大包合同.doc
- 第1章--水轮机安装.doc
- 某医院重度精神残疾人托养中心装修改造工程监理规划.doc
- 施工预算的核定.doc
- 争夺大数据挖掘制高点.docx
- 计算机图形学试卷及参考答案.doc
- 个人总结成本指标控制办法.doc



评论10