当前课程知识点:C语言程序设计 > 第9章 指针 > 9.4 指向二维数组的指针变量(上) > 指向二维数组的指针变量
同学们好
这一节中我们将和同学们探讨
指针与二维数组的关系
和大家一起研究行指针
列指针
元素的地址
元素的内容
本节内容复杂
表达式等价形式众多
同学们要多思考
多练习
以便于掌握指针的精髓
用指针变量可以指向一维数组中的元素
也可以指向多维数组中的元素
但在概念上和使用上
多维数组的指针比一维数组的指针要复杂
为了说清楚指向多维数组元素的指针
先回顾一下多维数组的性质
以二维数组为例
假设我们定义个一个整型3行4列的二维数组a
下面我们对该数组进行分析
我们说二维数组a首先是一个一维数组
这个一维数组有3个元素
a[0]
a[1]
a[2]而每一元素又是一个一维数组
它包含4个元素(即4个列元素)
也就是这个二维数组有三行
每一行又是一个4个元素的一维数
那么
a[0]所代表的一维数组又包含4个元素:a[0][0]
a[0][1]
a[0][2]
a[0][3]
从对一维数组的研究我们可以得出结论
数组所有元素中相同的那部分是数组名
则a[0]为二维数组中这一行的数组名
同理a[1]为二维数组中第1行的数组名
a[2]为二维数组中第2行的数组名并且
我们可以认为二维数组是
数组的数组
即数组a是由3个一维数组所组成的
从二维数组的角度来看
a代表二维数组首元素的地址
那么二维数组的首元素不是一个整型变量
而是由4个整型元素所组成的一维数组
因此a代表的是首行(即第0行)的地址
a+1代表第1行的地址
a+2代表第2行的地址
即a
a+0
a+1
a+2是行地址
a[0]
a[1]
a[2]既然是一维数组名
而C语言又规定了数组名
代表数组首元素地址
因此a[0]代表一维数组a[0]
中第0列元素的地址
即取缔值a[0][0]
a[1]的是第1行首元素的地址
即a[1][0]的地址
a[2]的值是第2行首元素的地址
即a[2][0]的地址
请同学们考虑第0行第2列元素的地址
怎么表示?
a[0]为一维数组名
是数组中首元素的地址
那么对数组中各其它元素的地址
我们可以采取偏移量计算的方式
该一维数组中第2个元素
显然应该用首地址偏移一个元素
即a[0]+1来表示
那么对于a[0]数组用数组名
加偏移量方式来表示地址可以表示为
a[0]+0
a[0]+1
a[0]+2
a[0]+3
他们分别是a[0][0]
a[0][1]
a[0][2]
a[0]3]
元素的地址即取缔值a[0][0]
取缔值a[0][1]
取缔值a[0][2]
取缔值a[0][3])
对于a[1]数组中的元素我们
也可以用数组名加偏移量方式来表示地址
可以表示为:a[1]+0
a[1]+1
a[1]+2
a[1]+3
他们分别是a[1][0]
a[1][1]
a[1][2]
a[1]3]元素的地址即
取缔值a[1][0]
取缔值a[1][1]
取缔值a[1][2]
取缔值a[1][3])
a[2]数组也是如此
前已述及
a[0]和*(a+0)等价
a[1]和*(a+1)等价
a[i]和*(a+i)等价
因此
a[0]+1和*(a+0)+1的值都是取缔值a[0][1]
a[1]+2和*(a+1)+2的值都是取缔值a [1][2]
请注意不要将*(a+1)+2错写成*(a+1+2)
后者变成*(a+3)了
相当于a[3]
进一步分析
欲得到a[0][1]的值
用地址法怎么表示呢?
既然a[0]+1和*(a+0)+1
是a[0][1]的地址
那么
*(a[0]+1)就是a[0][1]的值
同理
*(*(a+0)+1)或*(*a+1)也是a[0][1]的值
同理
*(*(a+0)+1)或*(*a+1)也是a[0][1]的值
*(a[i]+j)或*(*(a+i)+j)是a[i][j]的值
今天的课就到这里
在这一节中我们和同学们探讨了
指针与二位数组的关系
和大家一起研究了
行指针、列指针、元素的地址
以及元素的内容
本节内容复杂
表达式等价形式众多
同学们要多思考,多练习
以便于掌握指针的精髓
同学们
我们下次课再见
-计算思维与计算机
--计算思维与计算机
--计算思维与计算机
--计算思维和计算机
-2.1 程序设计语言的发展及其特点和应用
--程序设计语言的特点及发展
- 2.2 C语言程序的基本结构及编制C语言程序的基本步骤
--C语言程序的结构和编制步骤
-3.1 C语言的数据类型
--C语言的数据类型
--C语言的数据类型
-3.2 常量
--常量
--常量
-3.3 什么是变量
--什么是变量
--什么是变量
-3.4 如何进行算术运算
--如何进行算术运算
--如何进行算术运算
-3.5 赋值运算符和逗号运算符
--赋值运算符和逗号运算符
-3.6 数据类型转换
--数据类型转换
--数据类型转换
-4.1 格式化输出printf
--格式化输出
-4.2 格式化输入scanf及字符数据的非格式化输入输出
--格式化输入
-5.1 关系运算符和关系表达式
--关系运算符和关系表达式
-5.2 逻辑运算符和逻辑表达式
--逻辑运算符和逻辑表达式
-5.3 条件运算符和条件表达式
--条件运算符和条件表达式
-5.4 if语句
--if语句
--if语句
-5.5 switch语句
--switch语句
--switch语句
-6.1 while语句
--while语句
--while语句
--do-while语句
-6.2 for语句
--for语句
--for语句
-6.3 循环的嵌套
--循环的嵌套
--循环的嵌套
-6.4 break语句和continue语句
--break和continue语句
-7.1 一维数组的定义和引用
--一维数组的定义和引用
-7.2 一维数组的赋值
--一维数组的赋值
--一维数组的赋值
-7.3 二维数组的定义和引用
--二维数组的定义和引用
-7.4 二维数组的赋值
--二维数组的赋值
--二维数组的赋值
-7.5 字符串的本质
--字符串的本质
--字符串的本质
-7.6 字符串操作的常用函数
--字符串常用函数
-7.7 字符串数组
--字符串数组
--字符串数组
-8.1 函数概述
--函数概述
--函数概述
-8.2 有参函数
--有参函数
--有参函数
-8.3 函数参数的传递方式
--函数参数的传递方式
-8.4 变量的作用域和生存期
--变量的作用域和生存期
-8.5 变量的存储类型
--变量的存储类型
--变量的存储类型
-8.6 函数的嵌套和递归调用
--函数的嵌套和递归调用
-8.7 函数的作用域与封装
--函数的作用域与封装
-9.1 指针变量的概念(上)
--指针变量的概念(上)
-9.2 指针变量的概念(下)
--指针变量的概念(下)
-9.3 指向一维数组的指针变量
--指向一维数组的指针变量
-9.4 指向二维数组的指针变量(上)
--指向二维数组的指针变量(上)
-9.5 指向二维数组的指针变量(下)
--指向二维数组的指针变量(下)
-9.6 动态内存分配
--动态内存分配
--动态内存分配
-10.1 编译预处理
--编译预处理
-11.1 用户自己建立数据类型
--用户自己建立数据类型
-11.2 定义结构体类型变量
--定义结构体类型变量
-11.3 结构体变量的引用与初始化
-11.4 结构体数组
--结构体数组
--结构体数组
-11.5 指向结构体类型数据的指针
--指向结构体类型数据的指针
-12.1 文件的基本概念和文件指针
--文件的基本概念和文件指针
-12,2 文件的打开和关闭
--文件的打开和关闭
--文件的打开和关闭
-12.3 文本文件读写
--文本文件读写
--文本文件读写
-12.4 二进制文件读写
--二进制文件读写
--二进制文件读写