(C/C++学习)7.数组及其访问方式

说明:数组的数据类型是一种构造类型,而存储数组的内存是一段连续的存储区域。数组的数据类型决定了连续内存的访问方式,它包括数组的三要素:起始地址、步长以及元素个数。ios

 

一.一维数组数组

1.形式:type 数组名[N],type为该一维数组中元素的类型(即步长),N表示该数组中的元素个数,而数组名则是数组元素的起始地址,例如:int arr[10];ide

2.数组的大小:sizeof(数组名)=元素类型所含字节数*元素个数;spa

3.初始化:code

 1     int arr1[10] = {1,2,3};
 2     //部分初始化(前三个元素)
 3     int arr3[10] = {0};
 4     //数组清零

 

4.访问:数组名是数组的惟一标识符,数组名具备两重含义。blog

   a.就做为数组名时,表示一种构造类型,此时能够用来打印数组的大小(包含的字节数),例如:内存

 1 printf("%d",sizeof(数组名));

 

   b.数组名用来访问成员时,它表示的是首元素的地址,而对数组名取地址的时候,它表示的是整个数组的首地址,所以,如下代码的输出结果是不同的,这个很是重要!ci

 1     int arr[8] = {1,2,3};
 2     printf("%p\t%p\n",arr,arr+1);
 3     printf("%p\t%p\n",&arr,&arr+1);

程序输出结果:get

1捕获

 

 

二.二维数组it

1.形式:type name[M][N],二维数组其实也能够当作是一个一维数组(任何多维数组均可以当作是一个一维数组),只是数据成员的的类型由基本类型(如:int、char等)变成了构造类型:一维数组(多维数组)。例如int arr[3][4]能够当作是int[4] arr[3],这是一个一维数组,数组名为arr,数组成员的类型为int[4](一维数组),数组中的元素个数为3,其它多维数组也可按此方式理解。

2.二维数组在逻辑和内存上的理解:二维数组在逻辑上能够理解为二维的,例如int arr[3][4],能够想成其含有3行4列,共3*4个元素,固然也可按上述方式去理解,则理解为该二维数组中含有3个一维数组,其中每一个一维数组中又含有四个int类型的元素,这两种方式实际上是一致的。可是计算机的内存是线性的,这意味着内存对数据的存储方式都是一维线性的,所以,二维数组的访问方式能够有如下两种:

 1     //方式一
 2     for(int i = 0;i<3;i++)
 3     {
 4         for(int j = 0;j<4;j++)
 5             printf("%d ",arr[i][j]);
 6     }
 7     //方式二
 8     int *p = (int*)arr;
 9     for(int i = 0;i<sizeof(arr)/sizeof(int);i++)
 10         printf("%d ",*p++);

3.就像是一维数组同样,二维数组名也表明其第一个元素的地址,只不过这里的第一个元素的类型变成了一个一维数组,如int arr[3][4],执行arr+1实际上至关因而在二维数组的行间跳转,由于arr表明的是第一个元素(一维数组),所以执行加一操做时,加的是该一维数组的大小。而执行&arr+1时,就像上面提到的同样,加的是整个数组的大小,由于&arr+1表明的是整个数组的起始地址。

 1     int arr[3][4];
 2     printf("%p %p\n",arr,arr+1);
 3     printf("%p %p\n",&arr,&arr+1);

程序运行结果:

32获

 

 

 

4.二维数组的访问方式,如对于int arr[3][4],arr[i][j]表示二维数组第i行第j列的元素(第i个一维数组里面的第j个元素),也能够这样来访问:*(*(arr+i)+j),一样表示第i行第j列的元素。对于第二种方式,能够这样理解:首先,arr是一个二维数组,arr+i表示指向二维数组的第i行,对其*一次则从arr这个二维数组的二维数组模式降到了这个二维数组的第i行(即降维,从二维降到了第i个一维数组),一样的道理,对该一维数组加j再*,则又从一维数组模式降维到了单个元素模式,这就取出了该二维数组的第i行第j列的元素。二维数组的两种访问方式以下:

 1     //方式1
 2     for(int i = 0;i<3;i++)
 3     {
 4         for(int j = 0;j<4;j++)
 5             printf("%d ",arr[i][j]);
 6     }
 7     //方式2
 8     for(int i = 0;i<3;i++)
 9     {
 10         for(int j = 0;j<4;j++)
 11             printf("%d ",*(*(arr+i)+j));
 12     }

 

 

三.多维数组

1.形式:type name[x][y][z],一样的道理,也能够理解为是这样一个一维数组:type [y][z] name[x],这里再也不赘述。

 

 

四.拓展:申请一个堆上的动态二维数组,数组的行列采用输入方式肯定,而且将数组初始化为0

1.C++模式(输入行和列以空格或回车键分隔)

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int **getDoubleArray(int row,int col)
 5 {
 6     int **p = new int*[row];
 7     for(int i = 0;i<row;i++)
 8         p[i] = new int[col];
 9     return p;
 10     //返回堆上的二维空间
 11 }
 12 
 13 int main()
 14 {
 15     int i = 0,j = 0;
 16     int row ,col;
 17     cin>>row>>col;
 18     int **arr = getDoubleArray(row,col);
 19     for(i = 0;i<row;i++)
 20         for(j = 0;j < col;j++)
 21             arr[i][j] = 0;
 22 
 23     //这里可完成对二维数组的初始化的操做
 24 
 25     //释放申请的空间
 26     for(i = 0;i<row;i++)
 27         delete [] arr[i];
 28     delete [] arr;
 29     return 0;
 30 }
查看代码

2.c语言模式(输入行和列以空格或回车键分隔)

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 int **getarray(int rowl, int col)
 5 {
 6     int **p = (int**)malloc(rowl * sizeof(int*));
 7     for (int i = 0; i < rowl; i++)
 8         p[i] = (int*)malloc(col*sizeof(int));
 9     return  p;
 10 }
 11 
 12 int main()
 13 {
 14     int a, b;
 15     scanf("%d %d",&a,&b);
 16     int **p = getarray(a, b);
 17     for (int i = 0; i < a; i++)
 18     {
 19         for (int j = 0; j < b; j++)
 20             p[i][j] = 0;
 21     }
 22     for (int i = 0; i < a; i++)
 23     {
 24         for (int j = 0; j < b; j++)
 25             printf("%d ",p[i][j]) ;
 26     }
 27     for(int i = 0;i<a;i++)
 28         free (p[i]);
 29     free (p);
 30     return 0;
 31 }
查看代码

注意:返回堆上的二维空间还有其它方式,这里暂时以以上两种为例。

相关文章
相关标签/搜索