博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(C/C++学习)7.数组及其访问方式
阅读量:6294 次
发布时间:2019-06-22

本文共 3368 字,大约阅读时间需要 11 分钟。

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

 

一.一维数组

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

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

3.初始化:

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

 

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

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

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

 

   b.数组名用来访问成员时,它表示的是首元素的地址,而对数组名取地址的时候,它表示的是整个数组的首地址,因此,以下代码的输出结果是不一样的,这个非常重要!

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);

程序输出结果:

 

 

二.二维数组

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

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);

程序运行结果:

 

 

 

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 
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>>col; 18 int **arr = getDoubleArray(row,col); 19 for(i = 0;i
< col;j++) 21 arr[i][j] = 0; 22 23 //这里可完成对二维数组的初始化的操作 24 25 //释放申请的空间 26 for(i = 0;i
查看代码

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

1 #include
2 #include
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
查看代码

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

转载于:https://www.cnblogs.com/tuihou/p/9738885.html

你可能感兴趣的文章
IOE,为什么去IOE?
查看>>
Storm中的Worker
查看>>
dangdang.ddframe.job中页面修改表达式后进行检查
查看>>
Web基础架构:负载均衡和LVS
查看>>
Linux下c/c++相对路径动态库的生成与使用
查看>>
SHELL实现跳板机,只允许用户执行少量允许的命令
查看>>
SpringBoot 整合Redis
查看>>
2014上半年大片早知道
查看>>
Android 6.0指纹识别App开发案例
查看>>
正文提取算法
查看>>
轻松学PHP
查看>>
Linux中的网络监控命令
查看>>
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>