美文网首页C/C++开发交流程序员
C语言数组名是指针吗?网友们互相怼起来啦!

C语言数组名是指针吗?网友们互相怼起来啦!

作者: C语言Plus | 来源:发表于2018-12-25 18:40 被阅读4次

今天在某论坛下看到一篇文章,讨论一些关于数组名和指针的关系

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

#include

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

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

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

1 #include

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 型指针的字节长度。

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

2

3 int[10] intArray;

4 cout << sizeof(intArray) ;

5

6 /*

7 我们就都明白了,intArray定义为int[10]这种数据结构的一个实例,可惜啊

8C/C++目前并不支持这种定义方式。

9 */

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

C语言学习资料,基础视频,编译器请加Q群556791282

总结一句:

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

说的对与不对,请大家在下方讨论!

相关文章

  • C语言数组名是指针吗?网友们互相怼起来啦!

    今天在某论坛下看到一篇文章,讨论一些关于数组名和指针的关系 感觉楼主写的文字还是挺不错的,不过里面未免有些内容有些...

  • C语言中对数组和指针sizeof求值

    C语言中对数组名sizeof(数组名)得到的是 数组的大小 (单位是字节);对 指针sizeof(指针)得到的是 ...

  • C语言的指针与数组(进阶篇之一)

    一、一维数组与指针 (1).数组指针在C语言中,数组的首地址称为数组指针。而C++规定,数组的首地址可用数组名a表...

  • C语言指针和数组名区别

    最近在重新学习C语言,发现在学指针的时候,写到函数就会出现各种问题,百思不得其解,而且我也不太清楚指针和数组到底是...

  • C语言数组与指针关系

    前面一篇中,初步介绍了C语言的指针使用情况。这篇是对指针和数组关系的讲解。 1、数组名是数组首元素的地址 假设te...

  • C语言05- 指针

    C语言05- 指针 13:指针 指针是C语言中的精华,也是C语言程序的重点和难点。 13.1:指针定义与使用 指针...

  • c语言数组名和指针的关系

    一.数组名和指针 二.数组下标是否能为负数 可以的,编译器对这块没有做要求,所以是可以的。 三. 定义数组指针 四...

  • C语言指针总结大学霸IT达人

    C语言指针总结大学霸IT达人 C语言的指针是C语言区别其它语言的最主要的特定之一。有了指针,C语言就可以抛开所有束...

  • 带小白学C语言指针

    C语言里指针才是C语言的开始和指针;C语言里基本所有东西都是由指针演变而成; 指针是指向地址的变量,类型就是指针...

  • 第8章,数组

    一维数组 数组名 在 C中,几乎所有使用数组名的表达式中,数组名的值是一个指针常量(所以你不能给数组名重新赋一个新...

网友评论

    本文标题:C语言数组名是指针吗?网友们互相怼起来啦!

    本文链接:https://www.haomeiwen.com/subject/vucqlqtx.html