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

一.一维数组

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

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

3.初始化:

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

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

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

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

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

     int arr[8] = {1,2,3};
printf("%p\t%p\n",arr,arr+1);
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类型的元素,这两种方式其实是一致的。但是计算机的内存是线性的,这意味着内存对数据的存储方式都是一维线性的,因此,二维数组的访问方式可以有以下两种:

     //方式一
for(int i = 0;i<3;i++)
{
for(int j = 0;j<4;j++)
printf("%d ",arr[i][j]);
}
//方式二
int *p = (int*)arr;
for(int i = 0;i<sizeof(arr)/sizeof(int);i++)
printf("%d ",*p++);

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

     int arr[3][4];
printf("%p %p\n",arr,arr+1);
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
for(int i = 0;i<3;i++)
{
for(int j = 0;j<4;j++)
printf("%d ",arr[i][j]);
}
//方式2
for(int i = 0;i<3;i++)
{
for(int j = 0;j<4;j++)
printf("%d ",*(*(arr+i)+j));
}

三.多维数组

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

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

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

 #include <iostream>
using namespace std; int **getDoubleArray(int row,int col)
{
int **p = new int*[row];
for(int i = 0;i<row;i++)
p[i] = new int[col];
return p;
//返回堆上的二维空间
} int main()
{
int i = 0,j = 0;
int row ,col;
cin>>row>>col;
int **arr = getDoubleArray(row,col);
for(i = 0;i<row;i++)
for(j = 0;j < col;j++)
arr[i][j] = 0; //这里可完成对二维数组的初始化的操作 //释放申请的空间
for(i = 0;i<row;i++)
delete [] arr[i];
delete [] arr;
return 0;
}

查看代码

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

 #include<stdio.h>
#include<stdlib.h> int **getarray(int rowl, int col)
{
int **p = (int**)malloc(rowl * sizeof(int*));
for (int i = 0; i < rowl; i++)
p[i] = (int*)malloc(col*sizeof(int));
return p;
} int main()
{
int a, b;
scanf("%d %d",&a,&b);
int **p = getarray(a, b);
for (int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
p[i][j] = 0;
}
for (int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
printf("%d ",p[i][j]) ;
}
for(int i = 0;i<a;i++)
free (p[i]);
free (p);
return 0;
}

查看代码

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

(C/C++学习)7.数组及其访问方式的更多相关文章

  1. C语言中的数组的访问方式

    闲下来,写的代码,很是简单,不解释,代码如下: #include <stdio.h> int main(int argc, char **argv) { char cArray[] = & ...

  2. Oracle性能诊断艺术-学习笔记(索引访问方式)

    环境准备: 1.0 测试表 CREATE TABLE t ( id NUMBER, d1 DATE, n1 NUMBER, n2 NUMBER, n3 NUMBER, n4 NUMBER, n5 NU ...

  3. smarty中三种变量的访问方式

    在模板中smarty有三种变量,第一种,php分配的变量,第二种配置文件里的变量,第三种,PHP全局数组里的变量,配置文件里变量的访问方式可以是{#bgcolor#},"#"必须紧 ...

  4. java struts2入门学习实例--将客户端IP地址和访问方式输出到浏览器

    实例1:实现客户端IP地址和访问方式输出到浏览器. IpAction.java package com.amos.web.action; import javax.servlet.http.HttpS ...

  5. PHP学习之中数组-遍历一维数组【2】

    在PHP学习之中数组[1]中学会怎么创建一个数组,如果PHP学习之中数组[1]中的元素多的话,我们访问元素又是一个问题了,下面我们就使用for语句while,foreach来遍历我们的数组: < ...

  6. Python学习之数组类型一:

    Python学习之数组类型一: Numpy中的向量与矩阵: 1.创建:  向量.矩阵均由array函数创建,区别在于向量是v=array( [逗号分隔的元素] ), 矩阵是M=array( [[ ]] ...

  7. ADO.NET编程之美----数据访问方式(面向连接与面向无连接)

    最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接.于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(<ASP.NET MVC5 网站开发之美&g ...

  8. Java中Map集合的四种访问方式(转)

    最近学习Java发现集合类型真是很多,访问方式也很灵活,在网上找的方法,先放下备用 public static void main(String[] args) { Map<String, St ...

  9. TP中的四种url访问方式

    什么是PATHINFO:就是http://localhost/index.php/Home/Index/index/a/1/b/2?c=3中的红色部分, 注意c=3并不是pathinfo的一部分,它是 ...

随机推荐

  1. LeetCode 917. Reverse Only Letters (仅仅反转字母)

    题目标签:String 利用left, right 两个pointers, 从左右开始 互换 字母.如果遇到的不是字母,那么继续移动到下一个. Java Solution: Runtime beats ...

  2. 专訪印度电商Snapdeal CEO:学阿里还是京东

    [摘要]印度的互联网正成资本关注下一个投资焦点,也可能成中国互联网企业走向海外的桥头堡.为此.腾讯科技最近将推出走近印度"硅谷"系列文章,帮助大家了解印度互联网. 腾讯科技与Sna ...

  3. SOA究竟是个啥

    SOA(Service-Oriented Architecture),中文全称:面向服务的架构. SOA让把系统分离成不同的服务,使用接口来进行数据交互,终于达到整合系统的目的. 专业的词总是让人懵懵 ...

  4. tiny4412 裸机程序 一、说明【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37109115 首先.我想说明为什么我写这个文档?我自己想学点东西,过于求成,又过于自信,直接买了 ...

  5. 3.4 目录和spooling

    文件管理部分主要讲文件目录.文件目录它是用于检索文件的.文件目录它是一种文件系统实现按0存取的一种重要手段.一个文件目录它由若干个目录项组成的.每一个目录项它记录了一个文件的相关信息.这个文件信息指明 ...

  6. 一、Linux文件权限与目录配置

    行文结构如下: 用户和用户组 Linux文件权限概念 Linux目录配置 重点回顾 1.用户与用户组 Linux是个多用户.多任务的系统,可能有多人同时使用这台机器进行工作,为了考虑每个人的隐私和工作 ...

  7. eclipse中Kotlin的基础应用

    最近逛网站时无意中发现有一门新语言谈论很广-- kotlin ,能够完全兼容Java.这就引起了楼主的好奇心,据所周知,Java就是因为多平台的支持 才流行起来.OK,闲话不多说,下面看图讲代码. 1 ...

  8. mysql中类型转换

    MySQL 的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值 CAST(xxx AS 类型), CONVERT(xxx,类型) 二进制,同带binary前缀的效果 : ...

  9. viewDidUnload,viewDidLoad,viewWillAppear,viewWillDisappear的作用以及区别

    viewDidLoad:在视图加载后被调用 viewWillAppear:视图即将可见时调用.默认情况下不执行任何操作 viewDidAppear: 视图已完全过渡到屏幕上时调用 viewWillDi ...

  10. V3的普通窗体控件的使用

    1.文本: 属性: 标签对齐方式: Left  Right  Center 值对齐方式: Left  Right  Center 事件: 值改变事件 值加载事件 单击标题事件 键盘按下事件 获得焦点事 ...