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,它里面的内容是0x00000018,0x00000018是数组a的首地址。
我们对比一下pA和a我们就可以知道,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
- C++之数组与指针的异同
- 数组与指针的异同
- 指针与数组的异同
- 数组与指针的异同
- golang指针与C指针的异同
- C/C++指针和数组的异同
- java引用与C指针的异同
- go语言指针与C指针的异同
- 指针和数组的异同
- c语言之指针(指向数组元素的指针与指向数组的指针)
- C指针域数组区别之二维数组与指针的指针
- 指针与数组名异同比较总结
- C的数组与指针
- 指针与引用的异同
- 指针与引用的异同
- c++primer笔记之数组与指针的一些总结
- c语言核心整理之指针与数组的区别
- C语言之指针数组与数组指针
- 遍历treeview
- 按摩椅控件?
- 百度百科---逆波兰式
- the relationship
- apache continuum ci tool 使用说明
- C++之数组与指针的异同
- JAVA 与SOCKET通讯
- C#中DllImport用法和路径问题
- 毕业设计ing
- truncate table时发生ORA-02266错误
- python中的list如何进行相减操作或者将list分片
- XML2010-5-13
- Ubuntu下编译OpenMesh
- SQL Server 2008阻止保存要求重新创建表的更改