网站首页 > 精选教程 正文
数组是数据元素的线性顺序存储,二维数组是数组元素是一维数组的数组,三维数组是数组元素二维数组的数组,n维数组是数组元素是n-1维的数组。
数组名是一个特殊的指针,特殊之处在于其常量性质,以及数组名在不同的上下文中可以指向整个数组或数组的首元素(如果元素是数组或多维数组,则其元素的类型具有一各维长度的信息),移动时会有不同的步长。
为什么要区分在不同的上下文中数组名表示指向数组的首元素的地址呢?这是为了方便元素的访问,表示为首元素的地址时,可以用数组名加减一个整数(步长与元素的字节长度一致)来得到数组元素的地址。需要注意的是,数组的下标写法是指针写法的语法糖。
#include <stdio.h>
#define R 3
#define C 4
int main()
{
//数组名在不同的上下文中可以指向整个数组或数组的首元素,移动时会有不同的步长
int up = 111;
int arr[R][C] = {1,2,3,4,5,6,7,8,9,10,11,12};
// 可以通过“分裂原则”和“右左原则”来理解数组
// 其声明是将元素类型和维度分裂在标识符左右两侧
// Java可以声明为int[][] arr = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
// 对数组声明的理解,从标识符arr开始,先看右边,符号[],表示arr是一个数组,其元素个数是R,
// 继续右边,符号[]表示arr元素还是一个数组,数组的元素个数是C,右边看完看左边,元素类型是int
// 所以,arr是一个元素类型为一维数组int[C]的二维数组,元素个数为R
int down = 999;
int(*pp)[R][C] = &arr;
printf("%p %p %p %p\n",&up,&arr[R-1][C-1],arr,&down);//0012FF44 0012FF40 0012FF14 0012FF10
printf("%p %p %p\n",&up,pp+1,&arr+1);// 0012FF44 0012FF44 0012FF44
printf("%d\n",sizeof arr / sizeof *arr);// 3
// 数组名在与运算符&、sizeof一起使用的上下文中,数组名表示的是指向整个数组的指针
int(*p)[C] = arr;
printf("%p %p %p\n",&arr[1][0],p+1,arr+1); // 0012FF24 0012FF24 0012FF24
// 数组名在其它上下文中(不与运算符&、sizeof一起使用的场合),数组名表示的是指向数组首元素的指针
// 此时,数组名与一个整数的加减表示数组元素的移动。
int i,j;
for(i=0;i<R;i++)
for(j=0;j<C;j++)
printf("%d ",*(*(p+i)+j));// 数组的下标写法p[i][j]是指针写法的语法糖
int *q = &arr[0][0];
printf("\n");
for(i=0;i<R*C;i++)
printf("%d ",*(q+i));
// 一维数组
int ar1[12] = {1,2,3,4,5,6,7,8,9,10,11,12};
int(*pp1)[12] = &ar1;
int *p1 = ar1;
// 三维数组
int ar3[2][3][4] = {1,2,3,4,5,6,7,8,9,10,11,12,
13,14,15,16,17,18,19,20,21,22,23,24};
// ar3是一个元素类型为二维数组int[3][4]的三维数组,元素个数为2
int (*pp3)[2][3][4] = &ar3;
int (*p3)[3][4] = ar3;
getchar();
}
/*
0012FF44 0012FF40 0012FF14 0012FF10
0012FF44 0012FF44 0012FF44
3
0012FF24 0012FF24 0012FF24
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
*/
-End-
猜你喜欢
- 2024-11-16 面向JVM编译-类实例、数组的创建和使用
- 2024-11-16 来,一起聊聊Excel中的数组(excel数组公式有哪些)
- 2024-11-16 数组的维数及数组公式的讲解(数组维的大小)
- 2024-11-16 C语言中数组的类型和使用(c语言中数组的概念及作用)
- 2024-11-16 C# - 多维与交错数组 036(交错数组和多维数组有何区别?)
- 2024-11-16 Numpy第6练:如何操控数组的维度与形状?干货满满!
- 2024-11-16 NumPy之:多维数组中的线性代数(numpy 多维数组)
- 2024-11-16 S7-1200 数组数据类型(ARRAY)(s71200plc数据类型)
- 2024-11-16 JAVA中如何调用matlab并返回运算结果?
- 2024-11-16 Java基础03(java基础案例教程第二版)
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)