• C语言学习趣事_20_关于数组名与指针的讨论


         今天在ChinaUnix下看到一篇文章,讨论一些关于数组名和指针的关系,原帖的链接为:

    http://bbs.chinaunix.net/thread-871769-1-994.html

         感觉楼主写的文字还是挺不错的,不过里面未免有些内容有些误导,在此谈一些我个人的看法。

    Exp1:

     #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;

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

        这是文章里面的证明,首先这里证明虽然能说的过去,但是这不能作为:数组名不是指针的证明。

        因为如果我们把str声明为:

    char  str[4]
    

      那么这个证明就不严密了。

      数学逻辑推理,不能这么经不起推敲,反证法必须能排除所有情况。

    Exp2:

     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 }
    12 /*
    13
    14   程序的输出结果为4。不可能吧?
    15
    16   一个可怕的数字,前面已经提到其为指针的长度!
    17
    18   结论1指出,数据名内涵为数组这种数据结构,在arrayTest函数体内,str是数组名,那为什么sizeof的结果却是指针的长度?这是因为:
    19
    20   (1)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;
    21
    22   (2)很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
    23
    24   所以,数据名作为函数形参时,其全面沦落为一个普通指针!它的贵族身份被剥夺,成了一个地地道道的只拥有4个字节的平民。
    25
    26   以上就是结论4。
    27 */

         这里有一点必须说明: 虽然声明函数头的时候,采用的是数组的形式声明,但是编译器在处理的时候,直接把str解释成指针变量。

    这也就是为什么可以在形式参数声明变长度数组的原因。

    即: char  str[] ————> char  *str

        C语言中,我们知道C89明确规定,不能定义变长数组。在C99里面虽然支持变长数组,但是也是有限的支持,这个有兴趣的

    朋友可以自己去讨论。

          但是由于上面描述的解释原因,因此可以定义变长的数组形式参数。同时说明一点,这里 sizeof str  实际进行的操作还是返回的

    是一个char 型指针的字节长度。

    Exp3:

    1 //如果C/C++程序可以这样写:
    2
    3 int[10] intArray;
    4 cout << sizeof(intArray) ;
    5
    6 /*
    7   我们就都明白了,intArray定义为int[10]这种数据结构的一个实例,可惜啊,C/C++目前并不支持这种定义方式。
    8
    9 */

         这里,有一点也许可能很奇怪的特性,我就不多说了,有兴趣的朋友,可以看看这里是否有一些特殊的特性存在呢。

         总结一句:

              数组名表示的是数组存储的首地址,并且是一个const value;不是一个左值。至于其他的理解那就是各位见仁见智了。

    说的对与不对,请大家跟帖评论。


        

  • 相关阅读:
    制作透明色:《CSS3 RGBA》与Opacity样式用法
    制作动画效果:《CSS3 Animation》
    CISCO运维记录之3650堆叠设备升级IOS(Version 16.3.6版本存在bug)
    08 Zabbix4.0系统配置事件通知
    24 Zabbix系统配置日志监控告警--关键字触发
    15 Zabbix Item类型之Zabbix trapper类型
    06 Zabbix4.0系统CISCO交换机告警模板规划信息(基础)
    05 Zabbix4.0触发器表达式Trigger expression支持的函数
    04 Zabbix4.0系统配置触发器trigger
    03 Zabbix4.0添加cisco交换机基本监控步骤
  • 原文地址:https://www.cnblogs.com/volcanol/p/2336374.html
Copyright © 2020-2023  润新知