浅析数组与指针的联系与区别1

以前总感觉数组和指针冥冥之中有点联系,最近发现不只是有点点联系,甚至可以说是基本等价。下面是本人将结合代码对其进行讲解。由于本人学识尚浅,以下如有错误,欢迎指正。

首先,从较简单的数组开始。

#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;
}

这个例子更好的验证了-------------指针和数组基本等价的结论。

未完待续......

猜你喜欢

转载自blog.csdn.net/zhuyinglong2010/article/details/44260605
今日推荐