C语言笔记(二维数组与数值指针)
一、关于二维数组和二维数组区别
(1)一维数组在内存中是连续分布存储的,同样,二维数组也是在内存连续存储的。所以从内存的角度来分析,一维数组和二维数组其实没有本质区别。
(2) 二维数组可以使用一维数组来代替。但是在实际的应用中,有时候使用二维数组会更加直观,方便程序的编程。
(3)两者在内存使用效率上是一模一样的。
二、二维数组的第一维和第二维概念
(1)例如 int a[2][5]中,前面的2表示第一维;后面的5表示第二维
(2) 二维数组的第一维表示最外部的那一层,第一维本身也是一个数组,里面存放了2个元素,这两个元素就分别是第二维的数组。第二维数组本身也是一个数组,里面存放的元素是普通的int型变量。
三、二维数组的下标访问
例1:
- int a[][] = {{,,,,},{,,,,}};
- int (*p)[]; // 定义一个数组指针
- p = a;
- printf(" a[1][2] = %d.\n", a[][]); // a[1][2] = 8
- printf("(*(p+1)+1) = %d.\n", *(*(p+)+)); // a[1][2]
运行结果:
四、关于二维数据必须要明白的几个符号
例2:理解 a 、&a、 a[0]、 &a[0]、 a[0][0]、 &a[0][0]
- /*
- 二维数组的几个符号的测试
- 1、a等同于&a[0]
- 2、a[0]等同于&a[0][0]
- 3、在数值上 a、&a、a[0]、&a[0]、&a[0][0] 是相等的,但是在类型上面是有区别的。
- */
- int a[][] = {{,,,,},{,,,,}};
- printf("a = %p.\n", a); // a 类型是 int (*)[5]
- printf("&a = %p.\n", &a); // &a 类型是 int (*)[2][5]
- printf("a[0] = %p.\n", a[]); // a[0] 类型是 int *
- printf("&a[0] = %p.\n", &a[]); // &a[0] 类型是 int (*)[5]
- printf("a[0][0] = %d.\n", a[][]); // a[0][0] 类型是 int
- printf("&a[0][0] = %p.\n", &a[][]); // &a[0][0]类型是 int *
运行结果:
例3:第一维和第二维的数组指针的使用
- // 二维数组与指针的结合使用
- int a[][] = {{,,,,},{,,,,}};
- int (*p1)[]; // 数组指针
- int *p2; // 一般指针
- p1 = a; // 等同 p1 = &a[0]; // 指向二维数组的数组名
- p2 = a[]; // 等同 p2 = &a[0][0]; // 指向二维数组的第一维数组
- printf("a[0][2] = %d.\n", *(*(p1+)+)); // a[0][2] = 3
- printf("a[1][2] = %d.\n", *(*(p1+)+)); // a[1][2] = 8
- printf("a[0][2] = %d.\n", *(p2+)); // a[0][2] = 3
- printf("a[0][4] = %d.\n", *(p2+)); // a[0][4] = 5
运行结果:
五、总结
(1)需要理解二维数组的实质和几个符号的含义。
(2)二维数组和数组指针两者是有紧密的关系的。学会使用数组指针来操作二维数组,重在实践操作使用就会加深理解。
注:学习笔记部分是在朱有鹏老师物联网视频教程中摘取,特此声明。http://www.zhulaoshi.org/
C语言笔记(二维数组与数值指针)的更多相关文章
- C语言复习---二维数组和二级指针的关系:没关系,别瞎想(重点)
前提:一维数组和一维指针为什么可以替换使用? ] = { , , }; int *p = a; ; i < ; i++) printf("%d ", *(p + i)); 上 ...
- 【学习笔记】【C语言】二维数组
1. 什么是二维数组 一个数组能表示一个班人的年龄,如果想表示很多班呢? 什么是二维数组?int ages[3][10]; 三个班,每个班10个人 相当于3行10列 相当于装着3个一维数组 二维数组是 ...
- C语言之二维数组
二维数组 还是一个数组,只不过数组中得每一个元素又是一个数组 1). 声明语法 类型 数组名[行][列]; 例: int nums[2][3];//2行3列的二维数组,保存的数据类型是int类型 c ...
- C语言 字符二维数组(多个字符串)探讨 求解
什么是二维字符数组? 二维字符数组中为什么定义字符串是一行一个? “hello world”在C语言中代表什么? 为什么只能在定义时才能写成char a[10]="jvssj" ...
- C语言中将二维数组作为函数参数来传递
c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h> void func(int n, char ...
- 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)可以省略第一维 ...
- C语言教学--二维数组和指针的理解
对于初学者对二维数组和指针的理解很模糊, 或者感觉很难理解, 其实我们和生活联系起来, 这一切都会变得清晰透彻. 我们用理解一维数组的思想来理解二维数组, 对于一维数组,每个箱子里存放的是具体的苹果, ...
- C语言基础--二维数组
二维数组概念: 数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组,二维数组是特殊的一维数组. 二维数组格式: 元素类型 数组名称[一维数组的个数][每个一维数组的元素个数]; 元素类型 ...
- 【C语言】二维数组做形参
二维数组有两种形式: ①在栈上: int a[4][4] = {...}; ②在堆堆上: int ** a = new int *[4]; for ...
随机推荐
- medoo数据库插入的问题
今天遇到疾行客同学提出的medoo insert方法不能插入数据库问题,我测试了一下 发现是可以的 而INSERT INTO "t_user" (username) VALUES ...
- iOS新建项目基本配置
项目整体同xib+代码的方式 1.调整项目文件结构 2.将资源图片导入工程 General->LaunchScreen 修改 3.App名称修改 info->Bundle name 4.删 ...
- spring boot 实践
二.实践 一些说明: 项目IDE采用Intellij(主要原因在于Intellij颜值完爆Eclipse,谁叫这是一个看脸的时代) 工程依赖管理采用个人比较熟悉的Maven(事实上SpringBoot ...
- mdk编译遇见的错误(LX4F120H),望各位指点迷津
程序如下 #define tBoolean int#define GPIO_PORTA_BASE g_pulGPIOBaseAddrs[0]#include "lib/gpio.h" ...
- 基于 CoreText 实现的高性能 UITableView
引起UITableView卡顿比较常见的原因有cell的层级过多.cell中有触发离屏渲染的代码(譬如:cornerRadius.maskToBounds 同时使用).像素是否对齐.是否使用UITab ...
- 怎样通过ajax提交数据
ajax的出现彻底改变了javascript命运,通过ajax可以直接向服务器提交数据,有两种方式: get方式,数据直接拼接在地址中 post方式,数据由data字段携带 post方式,data中是 ...
- ASP.NET中如何实现负载均衡
ASP.NET站点中做负载均衡: 基于HTTP协议我们可能发现我们要解决两点问题: 第一,做到负载均衡,我们需要一个负载均衡器. 可以通过DNS轮询来做,在DNS服务器上配置为每次对我们做负载均衡的同 ...
- MKServerBuilder.psd1
MKServerBuilder.psd1 # # Module manifest for module 'MKServerBuilder' # # Generated by: Edward Guan ...
- HDFS的Java客户端操作代码(HDFS删除文件或目录)
1.HDFS删除文件或目录 package Hdfs; import java.io.IOException; import java.net.URI; import org.apache.hadoo ...
- js 连续赋值
无意中网上发现的这个问题,预想的结果和真实的结果大相径庭. var a={n:1} var b=a; a.x=a={n:2} console.log(a.x); console.log(b.x); u ...