一改往日的燥热,今天天气很凉爽,非常适合在家睡觉(貌似每天都非常适合在家睡觉)。。。不瞎说了,接着昨天讲一些有关指针和数组的基础知识吧。
指针和数组:
话说,在C++中指针和数组是基本等价的,原因在于指针算数和C++内部处理数组的方式。C++中将数组名解释为地址,多数情况下数组名被解释为数组的第一个元素的地址。在C++中,我们在将指针变量加1后,其增加的值等于指向的类型占用的字节数。
有数组arr[10],则arr[1]和*(arr + 1)是等价的,同样*(arr + 2)和arr[2]也是等价的。通常,使用数组表示法时,C++都执行下面转换:
arrayname[i] becomes * (arrayname + i)
若使用的是指针,则C++也将执行同样的转换:
pointername[i] beacomes * (pointername + i)
在多数表达式中,数组名和指针名都表示地址,区别之一是,可以修改指针的值,而数组名是常量,可以将数组名理解为一个const型的指针。
另一个区别是,数组应用sizeof运算符得到的是数组的长度,而指针应用sizeof得到的是指针的长度,即使指针指向的是一个数组,这时C++不会将数组名解释为地址。
数组的地址:
对数组取地址时,数组名也不会被解释为其地址。数组名被解释为其第一个元素的地址,而对数组名应用地址运算符时,得到的是整个数组的地址:
short tell[10]; //tell数组长20个字节
cout << tell << endl; //显示tell[0]的地址,即&tell[0]
cout << &tell << endl; //显示整个数组的地址
从数字上说,这两个地址相同;但从概念上说,&tell[0](即tell)是一个2字节内存块的地址,而&tell是一个20字节内存块的地址。tell+1将地址值加2,而&tell+2将地址值加20。即tell指向一个short类型数据,而&tell指向包含20个元素的short数组(short(*)[20]).
这里要注意一点,如果要创建一个指向整个数组的指针,一定要注意它的括号:
short (*pas)[20] = &tell; //pas指向含有20个short型数据的数组
如果省略括号,优先级规则将使得pas先与[20]结合,导致pas是一个short指针数组。由于pas被设置为&tell,因此*pas和tell等价,所以(*pas)[0]为tell数组的第一个元素。
总之,使用new来创建数组以及使用指针来访问不同元素很简单,只要把指针当做数组即可。
这次先说这么多,再次感谢《C++ Primer Plus》,获益匪浅;非常适合对面向对象不是那么熟悉的同学,调理清晰,由浅入深。