以前总感觉数组和指针冥冥之中有点联系,最近发现不只是有点点联系,甚至可以说是基本等价。下面是本人将结合代码对其进行讲解。由于本人学识尚浅,以下如有错误,欢迎指正。
首先,从较简单的数组开始。
#include <iostream> using namespace std; int main() { int arr[3] = {0,1,2}; cout<<arr<<": "<<*arr<<endl; cout<<&arr[0]<<": "<<arr[0]<<endl; cout<<"============================="<<endl; cout<<arr+1<<": "<<*(arr+1)<<endl; cout<<&arr[1]<<": "<<arr[1]<<endl; cout<<"============================="<<endl; cout<<arr+2<<": "<<*(arr+2)<<endl; cout<<&arr[2]<<": "<<arr[2]<<endl; cout<<"============================="<<endl; cout<<"*arr+1: "<<*arr+1<<endl; cout<<"arr[0]+1: "<<arr[0]+1<<endl; return 0; }
从代码的运行结果(不同机器上运行的地址不尽相同)可以看出以下两点:
(1)数组名实质上是数组内第一个元素的指针,即数据名arr其实是数组中第一个元素arr[0]的地址,这点从输出结果的前两行结合对应的代码可以看出。
(2)数组名加1相当于地址后移一个单位。所谓单位实质就是所声明的指针类型所占的字节数,如例子中声明的是int类型的指针,加1后,地址后移了4个字节(本人所用的机器一个int型变量占用4个字节长度),这点结合输出结果的前六行(不包括“=”分割)可以看出。进而得出arr[i]与*(arr+i)等价的结论。
代码输出结果的最后两行是想提醒大家*的运算优先级,在使用的时候要注意括号的运用。如本例中*arr+1,先进行的*arr运算,然后再进行的加1操作,而不是地址加1再取值。
了解了以上基本内容后,我们再声明一个指针验证下。
#include <iostream> using namespace std; int main() { int arr[3] = {0,1,2}; int* p = arr;//声明一个int型指针p,并初值为arr,也就是数组arr第一个元素的地址。 cout<<p<<": "<<*p<<endl; cout<<arr<<": "<<arr[0]<<endl; cout<<"=============================="<<endl; cout<<p+1<<": "<<*(p+1)<<endl; cout<<arr+1<<": "<<arr[1]<<endl; cout<<"=============================="<<endl; cout<<p+2<<": "<<*(p+2)<<endl; cout<<arr+2<<": "<<arr[2]<<endl; return 0; }
未完待续......