数组名字是一个不是指针的指针!
晕!这是什么意思呢?
1.在备课中发现一个问题!
int array[10];
(1)cout<<array<<endl;//0x0012FF58
(2)cout<<&array<<endl;;//0x0012FF58
(3)cout<<&array[0]<<endl;;//0x0012FF58
(1)、(2)和(3)输出的结论是一样的。
早就在书上看到过这样的话,数组名字代表数组的首地址,那么本质区别是什么呢?
(4)cout<<array+1<<endl;//0x0012FF5C
(5)cout<<&array+1<<endl;//0x0012FF80
(6)cout<<&array[0]+1<<endl;//0x0012FF5C
从这几行代码可以看出(4)和(6)是等价的,即数组名字仅仅代表数组首地址,在首地址的基础上+1,即表示第二个元素的首地址。而(5)代表的是整个数组的首地址,所以+1的话,就是整个数组末尾的下一个地址,0x0012FF58+40=0x0012FF80(十六进制)。所以刚才(1)、(2)和(3)输出的结果一样,因为不管代表数组第一个元素的开始地址还是表示整个数组的开始地址,都是同一个位置。
int *p=array; //数组名字代表数组首地址,那么int *p=array;正确
(7)cout<<sizeof(array)<<endl;//40
(8)cout<<sizeof(p)<<endl;//4
数组名字的本质是什么?
a.数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;
b.数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;
所以sizeof(array)为40;而指向数组的指针p则是另外一种变量类型(在WIN32平台下,长度为4,long int型),仅仅意味着数组的存放地址!
2.下面的程序成立吗?
1. int intArray[10];
2. intArray++; 发现编译出错。原因在于,虽然数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改。
而指针,不管是指向结构体、数组还是基本数据类型普通整型变量、字符型、double等的指针,都不包含原始数据结构的内涵,在WIN32平台下,sizeof操作的结果都是4。
顺便纠正一下许多人的另一个误解:以为sizeof是一个函数,而实际上,它是一个操作符,不过其使用方式看起来的确太像一个函数了。语句 sizeof(int)就可以说明sizeof的确不是一个函数,因为函数接纳形参(一个变量),世界上没有一个C/C++函数接纳一个数据类型(如 int)为"形参"。
3.注意:数据名可能失去其数据结构内涵
到这里似乎数组名魔幻问题已经宣告圆满解决,但是平静的湖面上却再次掀起波浪。请看下面一段程序:
1. #include <iostream.h>
2. void arrayTest(char str[])
3. {
4. cout << sizeof(str) << endl;
5. }
6. int main(int argc, char* argv[])
7. {
8. char str1[10] = "I Love U";
9. arrayTest(str1);
10. return 0;
11. }
程序的输出结果为4。不可能吧?
结论1指出,数据名内涵为数组这种数据结构,在arrayTest函数中str是数组名,那为什么sizeof的结果却是指针的长度?这是因为:
(1)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;
(2)很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
所以,数据名作为函数形参时,其全面沦落为一个普通指针!它的贵族身份被剥夺,成了一个地地道道的只拥有4个字节的平民。
请看程序(本文程序在WIN32平台下编译):
1. #include <iostream.h>
2. int main(int argc, char* argv[])
3. {
4. char str[10];
5. char *pStr = str;
6. cout << sizeof(str) << endl;
7. cout << sizeof(pStr) << endl;
8. return 0;
9. }
4、我们先来推翻"数组名就是指针"的说法,用反证法。
证明 数组名不是指针
假设:数组名是指针;
则:pStr和str都是指针;
因为:在WIN32平台下,指针长度为4;
所以:第6行和第7行的输出都应该为4;
实际情况是:第6行输出10,第7行输出4;
所以:假设不成立,数组名不是指针
结论:
数组名不是指针,只不过c++赋予了数组名字可以读取数组首地址的特权。
分享到:
相关推荐
- **指针删除与堆空间释放**:释放指针指向的内存后,指针成为悬空指针,不应再次使用。 - **内存泄漏**:忘记释放分配的内存会导致内存泄漏。 - **重复释放**:重复释放同一段内存可能会导致程序崩溃或不稳定行为。...
### C++习题 6数组与指针知识点详解 #### 一、基本概念与基础知识自测题解析 ##### 5.1 填充题 **5.1.1 数组定义时有三个要素:** - **数组名**:数组的名字,用来标识这个数组。 - **数组元素的类型**:数组中...
数组指针和指针数组是C语言中关于指针和数组概念的重要知识点,它们虽然听起来相似,但其实是完全不同的两个概念,涉及到内存布局、指针的优先级问题、数组指针的定义、以及指针与整数运算的规则等方面。 首先,...
### 数组与指针概念剖析 #### 前言 本文是基于2005年发表的《再再论指针》的修订...在后续章节中,我们将进一步探讨指针与数组的高级用法,包括指针算术、动态内存分配等主题,以帮助读者更全面地掌握这一核心技能。
### C++ 第四讲:数组与指针 #### 数组部分 **数组的基本概念** 数组是一种数据结构,用于表示一组相关的数据项。这些数据项必须是相同的数据类型,并且存储在连续的内存区域中。数组的元素可以通过下标访问,...
### C++中二维数组与指针关系的剖析 在C++编程语言中,指针的使用对于高效地管理和操作内存至关重要。特别是在处理复杂的结构化数据时,如二维数组,掌握指针的应用技巧变得尤为重要。本文将深入探讨C++中二维数组...
在编程世界中,理解和掌握常量、堆与栈、数组与指针的区别是至关重要的基础知识。这些概念构成了程序设计的基础,对于优化代码性能、避免内存泄漏等问题有着直接的影响。下面,我们将逐一深入探讨这些主题。 首先,...
在C语言中,数组和指针是两个非常基础且重要的概念。数组是一种构造数据类型,它是由相同类型的多个变量组成的集合。...因此,对于想要精通C语言的开发者来说,花时间学习和练习数组与指针的应用是十分必要的。
指针与数组的转换也是C语言中的常见操作。数组名在很多情况下可以被视为指向数组首元素的指针,但需要注意的是,数组不是指针,它们在内存中是一段连续的空间。而指针可以被赋值、传递给函数或动态调整其指向的内存...
### C++函数数组指针的使用方法 #### 引言 C++作为一种强大的面向对象编程语言,提供了多种机制来提高程序的效率与可维护性。其中,“函数指针”是C++中的一个高级特性,它允许程序员以更加灵活的方式处理函数调用...
### C++一维数组与指针的关系 在C++中,一维数组和指针之间存在着密切的关系。本文将从不同角度对这一关系进行详细解释,并通过实例代码帮助理解。 #### 数组名作为地址 首先,我们需要明确的是,在C++中,数组的...
根据给定的信息,我们可以深入探讨C语言中的指针与一维数组的相关知识点。这里主要涉及指针数组的概念、指针与一维数组之间的转换方法,以及如何利用这些特性来实现数组元素的操作,如删除等。 ### C语言指针数组 ...
数组指针与字符串PPT课件 本PPT课件主要讲解数组和指针的概念、声明、引用、初始化和存储顺序等知识点,并结合实例讲解数组和指针在实际应用中的使用。 一、数组的概念 数组是一种数据结构, 由多个相同类型的...
主要讲了指针和数组一维数组的声明 语法形式:dataType arrayName[arraySize] dataType 表示数组元素的数据类型,可以是基本类型,也可以是用户自定义类型 arrayName 是数组的名字,数组名命名规则和变量名相同,...
new运算符返回的是一个指向所分配类型变量(对象)的指针,对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象本身没有名字。 堆区是不会在分配时做自动初始化的(包括清零),所以必须用初始化...
在C++二级教程中,数组、指针和引用是三个非常重要的概念,对于计算机等级考试二级C++来说,掌握这些知识点是必不可少的。 首先,数组是由一系列具有相同数据类型的数据元素所构成的集合,这些元素按照一定的顺序...
通过实践,你可以更好地理解和掌握二维数组的存储、遍历以及与函数和指针的交互,这些都是C语言编程中不可或缺的部分。同时,别忘了不断反思和改进你的代码,吸收他人的建议,这是成为一名优秀程序员的关键。
在这个名为"C/C++指针的用法总结实例工程"的项目中,我们将深入探讨五种关键的指针相关概念,包括双重指针、引用、指针函数、指针数组以及数组指针,并通过实际的例子来帮助理解这些概念。 首先,让我们看看双重...
### C数组指针与字符串实用PPT课件知识点解析 #### 一、一维数组的声明与引用 ##### 一维数组的声明 一维数组的声明格式为:`类型说明符 数组名[常量表达式];` 其中,“类型说明符”指的是数组元素的数据类型,如 ...
这里的`数据类型`通常是数组元素的类型,`变量名`是你为指针变量取的名字,`常量表达式`表示数组的长度。这对圆括号非常重要,不能省略,否则会被解析为定义一个指针数组。这样的定义意味着,你创建了一个指针,它...