C语言学习趣事_20_关于数组名与指针的讨论
2012-02-02 23:27
337 查看
今天在ChinaUnix下看到一篇文章,讨论一些关于数组名和指针的关系,原帖的链接为:
http://bbs.chinaunix.net/thread-871769-1-994.html
感觉楼主写的文字还是挺不错的,不过里面未免有些内容有些误导,在此谈一些我个人的看法。
Exp1:
这是文章里面的证明,首先这里证明虽然能说的过去,但是这不能作为:数组名不是指针的证明。
因为如果我们把str声明为:
那么这个证明就不严密了。
数学逻辑推理,不能这么经不起推敲,反证法必须能排除所有情况。
Exp2:
这里有一点必须说明: 虽然声明函数头的时候,采用的是数组的形式声明,但是编译器在处理的时候,直接把str解释成指针变量。
这也就是为什么可以在形式参数声明变长度数组的原因。
即: char str[] ————> char *str
C语言中,我们知道C89明确规定,不能定义变长数组。在C99里面虽然支持变长数组,但是也是有限的支持,这个有兴趣的
朋友可以自己去讨论。
但是由于上面描述的解释原因,因此可以定义变长的数组形式参数。同时说明一点,这里 sizeof str 实际进行的操作还是返回的
是一个char 型指针的字节长度。
Exp3:
这里,有一点也许可能很奇怪的特性,我就不多说了,有兴趣的朋友,可以看看这里是否有一些特殊的特性存在呢。
总结一句:
数组名表示的是数组存储的首地址,并且是一个const value;不是一个左值。至于其他的理解那就是各位见仁见智了。
说的对与不对,请大家跟帖评论。
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:
#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。 */
这里有一点必须说明: 虽然声明函数头的时候,采用的是数组的形式声明,但是编译器在处理的时候,直接把str解释成指针变量。
这也就是为什么可以在形式参数声明变长度数组的原因。
即: char str[] ————> char *str
C语言中,我们知道C89明确规定,不能定义变长数组。在C99里面虽然支持变长数组,但是也是有限的支持,这个有兴趣的
朋友可以自己去讨论。
但是由于上面描述的解释原因,因此可以定义变长的数组形式参数。同时说明一点,这里 sizeof str 实际进行的操作还是返回的
是一个char 型指针的字节长度。
Exp3:
//如果C/C++程序可以这样写: int[10] intArray; cout << sizeof(intArray) ; /* 我们就都明白了,intArray定义为int[10]这种数据结构的一个实例,可惜啊,C/C++目前并不支持这种定义方式。 */
这里,有一点也许可能很奇怪的特性,我就不多说了,有兴趣的朋友,可以看看这里是否有一些特殊的特性存在呢。
总结一句:
数组名表示的是数组存储的首地址,并且是一个const value;不是一个左值。至于其他的理解那就是各位见仁见智了。
说的对与不对,请大家跟帖评论。
相关文章推荐
- C语言学习趣事_18_关于结构体_求讨论
- C语言学习趣事_关于指针转换
- C语言初学者关于数组指针的深度讨论
- C语言学习笔记(20) 数组参数和指针参数分析
- C语言学习趣事_关于指针转换
- C语言重新学习――数组与指针的关系
- C语言关于数组、指针、函数和结构体的其他知识
- C语言的关于指针的学习
- C语言学习趣事_关于C语言中的空格
- ios开发-c语言之指针和数组以及指针和字符串的学习
- C语言回顾与再学习——数组与指针
- 近两日关于数组名与指针学习汇总
- C语言学习--关于指针
- C语言学习笔记(18) 指针数组和数组指针分析
- iOS 学习第九天 C语言 指针与数组,结构体
- C语言关于数组与指针内容小结
- C语言学习笔记22——数组参数和指针参数
- c++关于数组,指针的学习总结
- C语言学习笔记【指针04】指针数组与指向指针的指针 推荐
- C语言学习趣事_20_Assert_Setjmp