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

 


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

 

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

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

 

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

 

void fun()

{

int i=2;

int *pI = &i;

int a[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 的长度的计算是这样的:

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

 

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

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

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

 

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

 

int aa[5][6];

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

const int 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值