1 int a[10]={1,2,3,4,5,6,7,8,9,10}; 2 int *ptr = (int *)(&a+1); 3 int *ptr2 = (int *)(a+1); 4 5 cout<<*(a+1)<<endl; 6 cout<<*(ptr-1)<<endl; 7 cout<<*(ptr2)<<endl;
对于这段代码
输出是:
2
10
2
对于a+1,这没有什么让人疑惑的地方,就是指向数组下一个元素,这里是int型,对于32位环境,就是内存地址+4.
让人困惑的是 &a+1 。这结果地址到底增长多少呢?
再插入一段代码:
1 cout<<"a[0]---address: "<<a<<endl; 2 cout<<"a[9]---address: "<<&a[9]<<endl; 3 cout<<"ptr---address: "<<ptr<<endl; 4 cout<<"[ptr-1]---address "<<ptr-1<<endl;
输出:
可以看出 &a+1 实际上增长是40,就是整个数组的长度。
我给出皮毛的结论是:一个数组名,你可以把它当指针使用,移动单位是其数据类型的大小,但是,使用 &后的,移动单位是整个数组的大小。
实际上,数组名并不是真正意义上的指针,其内涵要比指针丰富多,但是一旦把数组名当参数传入到别的函数,将会失去其别的意义,只剩下指针的意义。
假设array是一个已定义的数组
array++;
编译会出现
error C2105: '++' needs l-value
若将array当做参数传入函数中,则形参用此语法时合法的。这时,函数中的形参已经等同于一个指针了。