C++之数组与指针的异同

来源:互联网 发布:软件编程基础知识 编辑:程序博客网 时间:2024/04/29 09:55

 


       原创文章,转载请注明出处,谢谢!       
       作者:清林,博客名:飞空静渡

 

<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->

C++中会经常使用数组和指针,并且有时会把指针当数组使用或者反过来把数组当指针用,但有些人并不知道数组和指针有哪些相同点和不同点,今天就简略说一下。

 

下面我们看一下一个函数的代码:

 

voidfun()

{

inti=2;

int*pI = &i;

inta[5];

int* const pA a;

}

 

首先,我们看下数组a,其实数组a实际上是一个指针,它引用的是数组中的第一个元素。

那么数组和指针有哪些差异呢?

第一个差异就是大家都知道的大小问题。即sizeof(a)sizeof(pA)sizeof(a)是整个数组的大小,而sizeof(pA)是指针的大小。

 

另一个区别是很多人都没有意识到的一个区别,那就是数组和指针的地址的问题。

我们先看指针,我们都知道,指针是有地址的,它的这个地址里的内容是一个地址,而这个地址是某个区域的内容。

数组呢,它和指针不同,它没有地址,或者说,它的地址就是数组的这块区域的首地址。

这里说的有些坳口,我们看下图吧,图片说明问题直接一些。

 

我们看下pI指针:

<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->

我们看上图,指针pI是有地址的,它的地址是0x00000014,这个地址里面的内容是一个地址0x00000010,而0x00000010这个地址是变量i的地址,它里面的内容是整数值2

 

下面我们看下数组a的情况:

<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->

我们看上图,数组a的这个名字表示的就是数组的这块区域的地址0x00000018

 

我们再和pA指针对比一下:

<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->

pA是有地址的,它的地址是0x00000027,它里面的内容是0x000000180x00000018是数组a的首地址。

 

我们对比一下pAa我们就可以知道,pA是有地址的,而a是没有地址的,说a有地址是说a代表的是数组这块区域,是数组的首地址。

 

a的长度的计算是这样的:

constint aLen = sizeof(a)/sizeof(a[0]); // aLen = 5

 

那么既然a代表的是a数组的第一个元素的指针,那么&a又是什么呢?我们看下下面的表达式:

int(*pAA)[5] = &a;

&a表示的是整个数组的地址,而不是第一个元素的地址,虽然它们的值是一样的。

 

最后,我们看下多维数组的情况。

 

intaa[5][6];

那么aa的长度是多少,aa的长度计算可以是这样:

constint aaLen = sizeof(aa)/sizeof(aa[0]); // aaLen = 5

那么我们怎么看待多维数组?

我们可以记住这一条:多维数组的第一个元素的类型是数组,而不是基本类型。

 

我们看到aa的意思是指向包含6个整形数的数组的第一个元素的指针,而不是指向整形数的指针。

 

最后,我们以一个程序来说明以上的问题:

<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->

编译:g++-g -Wall main.cpp

运行:./a.out

输出:

 

最后这篇文章的pdf下载:

C++之数组与指针的异同.pdf