`
Riddick
  • 浏览: 642085 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

数组名不完全等于指针

阅读更多

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。

 

魔幻数组名

请看程序(本文程序在WIN32平台下编译):

#include  <iostream.h>
int main(int argc, char* argv[]) 
{ 
 char str[10]; 
 char *pStr = str; 
 cout  << sizeof(str)  < < endl; 
 cout  << sizeof(pStr)  < < endl; 
 return 0; 
}  

  1、数组名不是指针

  我们先来推翻"数组名就是指针"的说法,用反证法。

  证明 数组名不是指针

  假设:数组名是指针;

  则:pStr和str都是指针;

  因为:在WIN32平台下,指针长度为4;

  所以:第6行和第7行的输出都应该为4;

  实际情况是:第6行输出10,第7行输出4;

  所以:假设不成立,数组名不是指针

  2、数组名神似指针

  上面我们已经证明了数组名的确不是指针,但是我们再看看程序的第5行。该行程序将数组名直接赋值给指针,这显得数组名又的确是个指针!

  我们还可以发现数组名显得像指针的例子:

#include  <string.h> 
#include  <iostream.h> 
int main(int argc, char* argv[]) 
{ 
 char str1[10] = "I Love U"; 
 char str2[10]; 
 strcpy(str2,str1); 
 cout  << "string array 1: "  < < str1  < < endl; 
 cout  << "string array 2: "  < < str2  < < endl; 
  return 0; 
} 

   标准C库函数strcpy的函数原形中能接纳的两个参数都为char型指针,而我们在调用中传给它的却是两个数组名!函数输出:

string array 1: I Love U 
string array 2: I Love U 

   数组名再一次显得像指针!

  既然数组名不是指针,而为什么到处都把数组名当指针用?于是乎,许多程序员得出这样的结论:数组名(主)是(谓)不是指针的指针(宾)。

 

揭密数组名

 

  现在到揭露数组名本质的时候了,先给出三个结论:

  (1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;

  (2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;

  (3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!

 

1、数组名指代一种数据结构:数组

 

  现在可以解释为什么第1个程序第6行的输出为10的问题,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的char型数组,所以sizeof(str)的结果为这个数据结构占据的内存大小:10字节。

  再看:

int intArray[10]; 
cout  << sizeof(intArray) ; 

   第2行的输出结果为40(整型数组占据的内存空间大小)。

  如果C/C++程序可以这样写:

int[10] intArray; 
cout  << sizeof(intArray) ; 

 

  我们就都明白了,intArray定义为int[10]这种数据结构的一个实例,可惜啊,C/C++目前并不支持这种定义方式。

 

2、数组名可作为指针常量

 

  根据结论2,数组名可以转换为指向其指代实体的指针,所以程序1中的第5行数组名直接赋值给指针,程序2第7行直接将数组名作为指针形参都可成立。

  下面的程序成立吗?

int intArray[10];
intArray++; 

   读者可以编译之,发现编译出错。原因在于,虽然数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改。

  而指针,不管是指向结构体、数组还是基本数据类型的指针,都不包含原始数据结构的内涵,在WIN32平台下,sizeof操作的结果都是4。
顺便纠正一下许多程序员的另一个误解。许多程序员以为sizeof是一个函数,而实际上,它是一个操作符,不过其使用方式看起来的确太像一个函数了。语句sizeof(int)就可以说明sizeof的确不是一个函数,因为函数接纳形参(一个变量),世界上没有一个C/C++函数接纳一个数据类型(如int)为"形参"。

 

3、数据名可能失去其数据结构内涵

 

  到这里似乎数组名魔幻问题已经宣告圆满解决,但是平静的湖面上却再次掀起波浪。请看下面一段程序:

#include  <iostream.h>
 
void arrayTest(char str[]) 
{ 
 cout  < < sizeof(str)  < < endl; 
} 

int main(int argc, char* argv[]) 
{ 
 char str1[10] = "I Love U"; 
 arrayTest(str1); 
 return 0; 
} 

   程序的输出结果为4。不可能吧?

  一个可怕的数字,前面已经提到其为指针的长度!

  结论1指出,数据名内涵为数组这种数据结构,在arrayTest函数体内,str是数组名,那为什么sizeof的结果却是指针的长度?这是因为:

  (1)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;

  (2)很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。

  所以,数据名作为函数形参时,其全面沦落为一个普通指针!它的贵族身份被剥夺,成了一个地地道道的只拥有4个字节的平民。

  以上就是结论4。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rjzou2006/archive/2008/04/15/2292698.aspx

分享到:
评论

相关推荐

    彻底理解指针,指针数组和数组指针,指针函数和函数指针

    ### 彻底理解指针,指针数组和数组指针,指针函数和函数指针 #### 一、基础知识 在计算机编程中,指针是一个非常重要的概念,尤其是在C/C++这样的语言中更是如此。简单来说,指针是一种变量,但它存储的不是普通的...

    C/C++数组名与指针区别深层探索

    数组名与指针之间存在着密切的关系,但它们并非完全相同。在很多情况下,数组名的行为类似于指向数组第一个元素的指针,这种相似性有时会让初学者乃至有一定经验的程序员感到困惑。本文将深入探讨数组名与指针之间的...

    数组指针和指针数组

    数组指针和指针数组是C语言中关于指针和数组概念的重要知识点,它们虽然听起来相似,但其实是完全不同的两个概念,涉及到内存布局、指针的优先级问题、数组指针的定义、以及指针与整数运算的规则等方面。 首先,...

    C语言数组指针(指向数组的指针)_C语言中文网1

    需要注意的是,虽然在很多情况下数组名可以被视为指向数组首元素的指针,但数组和指针并不完全等价。数组名是一个常量指针,不能被重新赋值,而指针变量则可以。此外,数组类型和指针类型在某些情况下会有不同的行为...

    数组和指针的区别(通俗易懂)

    尽管数组名可以被当作指向数组首元素的指针使用,但这并不意味着数组本身就是指针。实际上,数组和指针有着根本的不同: 1. **可变性**:指针的值是可以改变的,它可以指向不同的内存位置,而数组名则是一个常量,...

    浅析C语言数组与指针.pdf

    实际上,数组名可以作为指向数组首元素的指针来使用。指向数组元素的指针变量定义方法与定义指向变量的指针变量相同。指针变量可以用来引用数组元素,既可以使用下标法也可以使用指针法。 在指针与数组的结合使用中...

    《再再论指针》修订版.pdf

    一维数组并不等于指针,尽管可以通过指针访问数组元素。 - **二维数组是二级指针**:同样,二维数组也不等同于二级指针。它仍然只是一个数组,尽管可以通过指针来处理。 - **数组名是一个常量指针**:这个表述也是...

    数组和指针的关系

    在C语言中,数组和指针之间存在着密切的关系,但它们并不是完全相同的概念。数组是一种特殊的存储结构,而指针则是一种变量,用于存储内存地址。理解它们之间的关系有助于我们更好地编写和理解C语言程序。 首先,让...

    C语言经典PPT,推荐部分指针,数组!

    但是,值得注意的是,虽然数组名和指针在某些方面相似,但它们并不完全相同。数组名是一个固定不变的常量指针,不能被重新赋值,而普通指针可以。 C语言的关键字是语言的保留字,它们具有特殊的含义,不能作为变量...

    政史地数组类型与指针类型PPT学习教案.pptx

    数组名在某种程度上可以被视为指向数组首元素的指针,因此,数组名可以被赋值给指向该数组元素类型的指针变量。例如,对于一维整型数组`int arr[5]`,可以声明一个指针`int *p`,然后赋值`p = arr;`,此时`p`就指向...

    Java程序中数组越界和空指针错误的静态分析.pdf

    例如,当尝试访问不存在的数组位置(如索引为负数或大于等于数组长度)时,Java会抛出`ArrayIndexOutOfBoundsException`。这种错误通常是由于程序员对数组边界理解不清或逻辑错误导致的。 2. **空指针异常**: - ...

    再再论指针

    - 注意:这种类型的指针不能直接用于访问单个元素,而是需要通过指针指向的数组来进行访问。 #### 六、“另类”数组 在C语言中,还可以创建一些特殊的数组形式,例如不完全数组或变长数组。 **不完全数组**: - ...

    利用一维数组中的数据构造完全二叉树

    #### 标题:利用一维数组中的数据构造完全二叉树 #### 描述:本文档介绍了一个通过一维数组构建完全二叉树的方法,并提供了一段示例代码作为参考。由于作者是自行编写代码并用于完成作业,因此在遇到问题时可寻求...

    彻底搞定C指针(完全版·修订增补版)

    - **数组名与指针的关系**:数组名在许多情况下可以视为指向数组首元素的指针。 - **遍历数组**:使用指针遍历数组的方法,以及指针自增操作在数组中的应用。 3. **指针与函数** - **参数传递**:通过指针作为...

    单片机原理与应用技术-数组和指针.pptx

    - 一维数组名本身就可以被视为指向数组首元素的指针,因此`P1=display[i];`实际上通过指针操作实现了数组元素的赋值。 综上所述,单片机原理与应用技术中的数组和指针是理解和编写高效单片机程序的关键。它们提供...

    语言二维数组与指针PPT学习教案.pptx

    初始化二维数组时,还可以按元素顺序进行,即不考虑行与列的关系,只提供元素值。如`int a[2][3]={1,2,3,4,5,6};`,或部分初始化,如`int a[2][3]={1,2,4};`。同样,如果省略第一维长度,如`int a[][3]={1,2,3,4,5};...

    【C语言/知识梳理/期末复习】指针(二)思维导图

    本篇文章主要讨论了C语言中的指针概念,包括数组名的理解、使用指针访问数组、数组传参的本质、冒泡排序、 二级指针、指针数组和指针数组模拟二维数组等。 1. 数组名的理解 数组名通常情况下是数组首元素的地址,...

    c语言对多维数组使用的总结

    C语言对多维数组的使用总结 一、多维数组地址的表示方法 在C语言中,多维数组可以被看作是一维数组的...应注意“(*指针变量名)”两边的括号不可少,如缺少括号则表示是指针数组,本章后面介绍的含义就完全不同了。

Global site tag (gtag.js) - Google Analytics