C++扩展数据类型

来源:互联网 发布:万网域名证书查询 编辑:程序博客网 时间:2024/06/06 15:00

字符数组

先来看看计算机中所占内存的情况 int b=2,char e=66在内存中占据的情况

Chare占一个字节,在计算机中的地址是:0x00FAF91B 16447771,前面是16进制后面是10进制,他的值是16进制的42,10进制就是66;

再看int b在内存中情况

Int占4个字节,在计算机中的地址是:0x00FAF90C 16447756;

再看int c内存情况


分析得知char e和intb内存地址分别为16447771,16447756,相差15说明不是相邻的,int c的指针是16447744也和intb相差12个字节,说明不是相邻的;

现在有一种方法就是让两个类型相同的数据变量相邻,并让它们组成一个块,我们就叫它数组表示方法是 类型 变量名[指针数],int a[5];为了更好的明白我现在把显示改为4字节的整数查看

从上面看出当我们用int a[5]={1,2,3,4,5}的时候内存开辟了5个渣啊而且还是相邻的每个相隔4字节,现在来观察a的地址:0x00FAF8E4 16447716,下面分别观察a[0]->a[4]的地址

A[0]的地址为:0x00FAF8E4 16447716,来看a[1]

A[1]的地址为:0x00FAF8E8 16447720,来看a[2]

A[2]:0x00FAF8EC 16447724,来看a[3]

A[3]:0x00FAF8F0 16447728,来看a[4]

A[4]:0x00FAF8F4 16447732,来看a[5]

A[5]:0x00FAF8F8 16447736,但是此时他的值是cccccccc,10进制为:3435973836,我们没有把这个值写到内存

综上可得,a的值就是指针&a[0]的值,说明inta[5],这里的a是指针,查询内存中的地址的时候直接用a或者&a,当我们用解除指针(*a)的时候此时就是&a[0]这个地址的值了,所以我们对inta[5],a解除指针的时候的值等于a[0];

上面是把数组分配到渣里面,分配到堆里 int *a=new int[5];

 

注意:取数组的值用值+[n]表示,值就是变量名,n是第几个指针默认0表示第一个指针的值,数组定义的指针数里面的值可以是空

 

 

 

现在来看下二维数组int aa[2][5]={{1,2,3,4,5},{6,7,8,9,10}},在内存中占据的情况:

从上图可以看出这个二维数组的值是相邻的,此时的二维数组aa指针是:0x00CFF70C 13629196,一维数组aa[0]:0x00CFF70C 13629196,一维数组aa[1]:0x00CFF720 13629216,此时在vs里面查内存地址的时候二维数组aa,一维数组aa[0],aa[1]都可以不用加&,说明aa[2][5],aa[0],aa[1]他们都是数组,只不过维数不一样,[2],这表示的这个二维数组里面有2个一维的数组,[5]表示的是每个一维数组里面有5个值,aa[2][5]的指针与第一个一维数组的指针一样,第二个一维数组的指针和第一个一维数组的指针相差20,一个int4个字节,则说明中间相隔了5int的字节,也就是一维数组aa[0][5]所占的字节数啦;现在来看下每个一维数组的值的指针情况:

此时再来看看&aa[1]的值的指针情况:

分析两个一维数组说明了什么呢?当我们要取去数组里面的值时候,其实用一维数组可以全部取出来的,只不过为了方便设置了多维;现在来看看实际操作中aa[0][5],aa[1][0]他们的值能不能正常调出来,是不是相等:

从上面可以看出一维数组int a[10]与二维数组int a[2][5]存储的数据大小都是一样的,第一个可以存10int类型的数据,第二个也可以存储10int类型的数据,只不过后者把10个数据分成了2个组!

 

注:多维数组表示法:int a[维数][每个维数里有多少个数据]int d[a][b]==int d[a*b],指针分配到堆的方法:int *d=new int[a*b]

原创粉丝点击