二维数组的每个元素都是一个一维数组,例如int arr[2][3]={{1,2,3},{4,5,6}};

下面通过几个例子来对二维数组进行深入了解:二维数组可以看作是一个父数组,他的每个元素都是一个一维的子数组。

(1)数组名表示数组首元素的地址,那么arr表示的是谁的地址?arr表示的是ar首元素的地址,也就是arr[0]的地址,同样arr[0],arr[1]也是两个子元素一维数组的数组名,可以分别用数组名a,b来代替,那么arr[0][0]表示a[0],ar[1][0]表示b[0],所以a(arr[0]),b(arr[1])作为数组名f分别也是a[0]和b[0]的地址,也就是arr[0][0]和arr[0][1]的地址:

#include<stdio.h>

int main()
{
int arr[2][3]={{1,2,3},{4,5,6}};
printf("arr表示的是arr的首元素地址:%p\n",arr);
printf("*(arr+0)表示的是arr的首元素地址:%p\n",*(arr+0));//arr表示的是arr的首元素arr[0]的地址,那么*(arr+0)表示的就是arr[0],arr[0]表示arr[0][0]的地址
printf("&arr[0][0]表示的是arr[0][0]的首元素地址:%p\n",&arr[0][0]);
printf("&arr[0]表示的是arr的首元素地址:%p\n",&arr[0]);
printf("arr[0]表示的是arr[0]这个子一维数组的首元素地址:%p\n",arr[0]); printf("arr[1]表示的是arr[1]这个子一维数组arr[1]的首元素地址:%p\n",arr[1]);
printf("&arr[1][0]表示的是arr[1]这个子一维数组arr[1]的首元素地址:%p\n",&arr[1][0]);
printf("arr[1]表示的是arr[1]这个子一维数组arr[1]的首元素地址:%p\n",arr[1]);
printf("*(arr+1)+0表示的是arr[1]这个子一维数组arr[1]的首元素地址:%p,偏移1后:%p\n\n",*(arr+1)+0,*(arr+1)+1);//偏移到arr[1]下一个元素的地址 return 0;
}

输出结果

arr表示的是arr的首元素地址:000000000061FE00
*(arr+0)表示的是arr的首元素地址:000000000061FE00
&arr[0][0]表示的是arr[0][0]的首元素地址:000000000061FE00
&arr[0]表示的是arr的首元素地址:000000000061FE00
arr[0]表示的是arr[0]这个子一维数组的首元素地址:000000000061FE00

arr[1]表示的是arr[1]这个子一维数组arr[1]的首元素地址:000000000061FE0C
&arr[1][0]表示的是arr[1]这个子一维数组arr[1]的首元素地址:000000000061FE0C
arr[1]表示的是arr[1]这个子一维数组arr[1]的首元素地址:000000000061FE0C
*(arr+1)+0表示的是arr[1]这个子一维数组arr[1]的首元素地址:000000000061FE0C,偏移1后:000000000061FE10

总结:*(p+i)+j和a[i][j]是等价的,数组名可以当作指针来用,表示地址

二维数组地址写法:

二维数组a的有关指针:

表示形式                                含义                                                                           地址

a                                            二维数组名,指向一维数组a[0],即0行首地址             2000

a[0] ,*(a+0),*a                     0行0列元素地址                                                          2000

a+1,&a[1]                              1行首地址                                                                   2016

a[1],*(a+1)                             1行0列元素a[1][0]的地址                                            2016

a[1]+2,*(a+1)+2,&a[1][2]       1行2列元素a[1][2]的地址                                            2024

*(a[1]+2),*(*(a+1)+2),a[1][2]  1行2列元素a[1][2]的值

嵌入式-C语言基础:二维数组的更多相关文章

  1. C语言基础--二维数组

    二维数组概念: 数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组,二维数组是特殊的一维数组. 二维数组格式: 元素类型 数组名称[一维数组的个数][每个一维数组的元素个数]; 元素类型 ...

  2. C语言基础:二维数组 分类: iOS学习 c语言基础 2015-06-10 21:42 16人阅读 评论(0) 收藏

    二维数组和一位数组类似. 定义: 数据类型 数组名[行][列]={{ },{ }....}; 定义时,一维(行)的长度可以省略,但是二维(列)的长度不可以省略.但是访问时,一定使用双下标. 二维数组的 ...

  3. C语言基础二维数组

    (1)二位数组的定义int array[n][m],行下标的取值范围是0~n-1,列下标的取值范围是0~m-1,二维数组最大下标元素是array[n-1][m-1]:如定义一个3行4列的数组 int ...

  4. C语言之二维数组

    二维数组 还是一个数组,只不过数组中得每一个元素又是一个数组 1). 声明语法 类型 数组名[行][列]; 例:  int nums[2][3];//2行3列的二维数组,保存的数据类型是int类型 c ...

  5. C语言 字符二维数组(多个字符串)探讨 求解

    什么是二维字符数组? 二维字符数组中为什么定义字符串是一行一个? “hello world”在C语言中代表什么? 为什么只能在定义时才能写成char   a[10]="jvssj" ...

  6. C Program基础-二维数组

    一维数组可以看作一行连续的数据,只有一个下标.C语言允许构造二维数组甚至多维数组,在实际问题中有时候常常需要用到二维数组(例如数学上的矩阵),二维数组有两个下标,以确定某个元素在数组中的位置. (一) ...

  7. C语言中将二维数组作为函数参数来传递

    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h> void func(int n, char ...

  8. C语言回顾-二维数组

    1.二维数组:是一个特殊的一维数组 完全初始化: 1)int a[2][3]={{1,2,3},{2,3,4}}; 2)连续赋值int a[2][3]={1,2,3,2,3,4}; 3)可以省略第一维 ...

  9. C语言教学--二维数组和指针的理解

    对于初学者对二维数组和指针的理解很模糊, 或者感觉很难理解, 其实我们和生活联系起来, 这一切都会变得清晰透彻. 我们用理解一维数组的思想来理解二维数组, 对于一维数组,每个箱子里存放的是具体的苹果, ...

  10. 【C语言】二维数组做形参

    二维数组有两种形式: ①在栈上:         int a[4][4] = {...}; ②在堆堆上:          int ** a = new int *[4];           for ...

随机推荐

  1. 03_Linux基础-文件类型-主辅提示符-第1提示符-Linux命令-内外部命令-快捷键-改为英文编码-3个时间-stat-其他基础命令

    03_Linux基础-文件类型-主辅提示符-第1提示符-Linux命令-内外部命令-快捷键-改为英文编码-3个时间-stat-{1..100}-du-cd-cp-file-mv-echo-id-she ...

  2. win10电脑自动连接蓝牙设备攻略

    每次在电脑上想连接蓝牙耳机,但不想手动去连接怎么办呢? 自动连接! 其实微软已经解决了这个问题,只要打开蓝牙,他就会自动匹配上次连接的设备 打开设置--->设备勾选 "显示使用&quo ...

  3. 发现tab换成空格不起作用,然后解决如下。

    今天发现把 .vimrc 加了set expandtab之后不起作用,这个本来是把代码中的制表符换成空格,免得不同人的设置不同造成代码缩进混乱. 然后搞了半天搞不定,应该是加载了.vimrc之后又加了 ...

  4. 利用 Gitea Doctor自助诊断工具帮助管理员排查问题

    ​我常常在Gitea论坛或者Hostea为网友解答Gitea版本升级方面的问题,但发现少有人知道利用 gitea doctor 命令行工具排查问题,因此这篇博文将给大家带来通俗易懂的介绍. 你知道吗? ...

  5. JavaWeb核心篇(3)——JSP,MVC,三层架构

    JavaWeb核心篇(3)--JSP,MVC,三层架构 在本篇文章中我们会学习到JSP,MVC,三层架构 虽然JSP已经快被时代所淘汰,但是在一些老旧的工作场所还是有在使用,所以了解一下也不为过 至于 ...

  6. 注意了!这样用 systemd 可能会有风险

    在 Linux 6 / CentOS 6 中,使用 service 来进行服务的起停,但是在 Linux 7 / CentOS 7 中,替换为使用 systemctl 命令来控制.将一些常用应用注册成 ...

  7. 10.第九篇 kube-scheduler 安装及验证

    文章转载自在:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483830&idx=1&sn=787de8d ...

  8. Portainer实用教程

    Portainer使用 Nginx 容器实现端口转发 在 WordPress 部署完成后,需要在浏览器内输入 IP:端口或域名:端口 的形式访问网站,但我们一般访问应用的时候都是希望不加端口就能访问域 ...

  9. Kafka QuickStart

    环境版本 操作系统:CentOS release 6.6 (Final) java版本: jdk1.8 kafka 版本: kafka_2.11-1.1.1.tgz 安装kafka 1. 下载压缩包, ...

  10. 不可错过的效能利器「GitHub 热点速览 v.22.39」

    如果你是一名前端工程师且维护着多个网站,不妨试试本周榜上有名的 HTML-first 的 Qwik,提升网站访问速度只用一招.除了提升网站加载速度的 Qwik,本周周榜上榜的 Whisper 也是一个 ...