数组与指针小结

http://www.cnblogs.com/krisdy/archive/2010/06/10/1755631.html

数组与指针的问题真的老生长谈了啊!都不想说了!

 

char str[10];

char*pStr = str;

sizeof(str);      //结果为10

sizeof(pStr);   //结果为4

于是我们可以得出结论:

(1)数组名不是指针;

(2)数组名神似指针。例如上面程序第二行将数组名直接赋值给指针,这显得数组名又的确是个指针。

 

既然数组名不是指针,而为什么到处都把数组名当做指针用?

于是乎很多程序员得出这样的结论:数组名(主)是(谓)不是指针的指针(宾)。整个一个魔鬼。

 

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

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

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

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

 

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

根据结论1解释上面程序中sizeof(str);的结果为10,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的char型数组,所以sizeof(str)的结果为这个数据结构占据的内存大小:10字节。

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

根据结论2,数组名可以转换成为指向其指代的实体的指针,所以程序1中的char*pStr = str;数组名直接赋值给指针可以成立。

引申:int intArray[10]; intArray++;  该程序成立嘛?

编译出错,原因在于,虽然数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改。而指针,不管是指向结构体、数组还是基本数据类型的指针,都不包含原始数据结构的内涵,在WIN32平台下,sizeof操作符的结构都是4.

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

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

void arrayTest(char str[]){

       cout<<sizeof(str)<<endl;

}

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

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

2)很遗憾,在失去其内涵的同时,它还失去了其重要特性,可以作自增、自减操作,可以被修改。(注意这一点,这个形参名字能做自增、自减等操作。其实也就是等价于形参为char*str

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值