深入了解深入了解c++数组与指针数组与指针
主要介绍了c++数组与指针的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
1.数组数组
数组大小(元素个数)一般在编译时决定,也有少部分编译器可以运行时动态决定数组大小,比如icpc(Intel C++编译器)。
1.1数组名的意义数组名的意义
数组名的本质是一个文字常量,代表数组第一个元素的地址和数组的首地址。数组名本身不是一个变量,不可以寻址,且不允
许为数组名赋值。假设定义数组:
int A[10];
那么再定义一个引用:
int* &r=A;
这是错误的写法,因为变量A是一个文字常量,不可寻址。如果要建立数组A的引用,应该这样定义:
int* const &r=A;
此时,现在数据区开辟一个无名临时变量,将数组A代表的地址常量拷贝到该变量中,再将常引用r与此变量进行绑定。此外,
定义一个数组A,则A、&A[0]、A+0是等价的。
在sizeof()运算中,数组名代表的是全体数组元素,而不是某个单个元素。例如,定义int A[5],生成Win32的程序,sizeof(A)
就等于5*sizeof(int)=5*4=20。示例程序如下。
#include <iostream>
using namespace std;
int main()
{
int A[4]={1,2,3,4};
int B[4]={5,6,7,8};
int (&rA)[4]=A; //建立数组A的引用
cout<<"A:"<<A<<endl;
cout<<"&A:"<<&A<<endl;
cout<<"A+1:"<<A+1<<endl;
cout<<"&A+1:"<<&A+1<<endl;
cout<<"B:"<<B<<endl;
cout<<"rA:"<<rA<<endl;
cout<<"&rA:"<<&rA<<endl;
}
运行结果:
A:0013F76C
&A:0013F76C
A+1:0013F770
&A+1:0013F77C
B:0013F754
rA:0013F76C
&rA:0013F76C
阅读以上程序,注意如下几点。
(1)A与&A的结果在数值上是一样的,但是A与&A的数据类型却不同。A的类型是int[4],&A的类型则是int(*)[4]。它们在概念
上是不一样的,这就直接导致A+1与&A+1的结果完全不一样。
(2)为变量建立引用的语法格式是type& ref,因为数组A的类型是int[4],因此为A建立引用的是int (&rA)[4]=A;
1.2数组的初始化数组的初始化
定义数组的时候,为数组元素赋初值,叫作数组的初始化。可以为一维数组指定初值,也可以为多维数组指定初值。例如。
Int A[5]={}; //定义长度为5的数组,所有数组元素的值都为0
int A[]={1,2,3}; //定义长度为3的数组,数组元素分别为1,2,3
int A[5]={1,2}; //定义长度为5的数组,A[0],A[1]分别为1,2,其他值均为0
int A[][2]={{1,2},{3,4},{5,6}}; //定义一个类型为int[3][2]的二维数组
int A[][2]={{1},{1},{1}}; //定义一个类型为int[3][2]的二维数组,A[0][0]、A[1][0]、A[2][0]三个元素的值为1,其他元素的值均为0