当前课程知识点:C语言程序设计 > 第9章 指针 > 9.3 指向一维数组的指针变量 > 指向一维数组的指针变量
同学们好
在这节当中
我们将和大家一起探讨
指向一维数组的指针变量
以及对一维数组表示的两种方法
指针法与下标法
以及如何用指针法代替我们常用的
下标法对数组进行基本的输入输出应用
首先我们来看什么是数组指针就是数组的地址
由于数组在内存中占据了一组连续的存储单元
因此数组指针指的是数组的起始地址
首地址
也就是第一个数组元素的地址
如果一个指针变量中存放了数组
的地址我们就称之为该指针变量指向了某数组
即这个指针变量是指向数组的指针变量
如我们定义10各元素整型数组a
然后定义一个存放整型数据地址的指针p
使用p赋值为取缔值a[0]
或p赋值为a使p存放数组的首地址
我们就称数组指针即取缔值a[0]
P为指向数组a的指针变量
指向数组的指针变量说明的一般形式为
类型说明符 *指针变量名;
其中类型说明符表示数组的类型
从该形式可以看出指向数组的
指针变量和指向普通变量的
指针变量的说明形式是完全相同的
如我们定义10各元素整型数组a
然后定义一个存放整型数据地址的指针p
使用p赋值为取缔值a[0]
或p赋值为a使p存放数组的首地址
我们就称数组指针即取缔值a[0]
P为指向数组a的指针变量
也可以表示为p赋值为取缔值a[0]
值得注意的是p是指针变量
它的值可以改变
而a
取缔值a[0]都是指针常量
下面我们研究指针与一维数组的关系
要研究指针与数组的关系
首先我们要从指针的算术运算+1运算开始
下面我们看如下的实例
我们假设有一个整型数组a
它有十个元素
现在我们定义一个整型的指针变量p
让他指向数组首元素
我们使用表达式p赋值为a完成这个操作
那么从这里我们来观察一下+1运算是什么
同学们可以考虑一下
p+1运算是移动一个字节
还是移动一个元素
回答这个问题之前
我们需要同学们来考量
指针的类型
它到底是一个什么样的含义
我们说指针
它是用来存放地址的一个内存单元
那么任何类型的指针变量都一样
都用来存放地址
而地址都是一样的大小
那么指针的类型有什么含义呢
它的含义就体现在这个基类型上面
不同类型的指针的+1运算是不一样的
系统规定指针元素的+1运算不是移动一个字节
而是移动一个元素
如果是32位机
那么整型的指针变量
他的+1运算是移动四字节
那么如果是字符类型的指针变量
那么它的+1预算是移动一个字节
从这里我们就可以看出
指针类型的+1运算决定着
指针向下移动多少字节数
这取决于他的基类型
指针算术+/-相应的计算公式是
p+/-i= p+/-i *d
这里d=sizeof(基类型)
那么这道例题当中当p指向数组a时
p+1指针下移一个元素
指向a[1]
p+2指向a[2]
p+i指向a[i]
p+9指向a[9].
也就是说p与a是a[0]的地址
等价于取缔值a[0]
p+1
a+1是a[1]的地址
等价于取缔值a[1]
p+i
a+i是a[i]的地址
等价于取缔值a[i]
p+9
a+9是a[9]的地址
等价于取缔值a[9]
*p与*a是取p
a所指向的内存单元a[0]的内容
等价于a[0]
*(p+1)与*(a+1)
是取p+1
a+1所指向的内存单元a[1]的内容
等价于a[1]
*(p+i)与(*a+i)
是取p+i
a+i所指向的内存单元a[i]的内容
等价于a[i]
*p+9与*(a+9)
是取p+9
a+9所指向的内存单元a[9]的内容
等价于a[9]
下面我们讲指向数组的指针
的下标表示法与指针表示法
如果一个指向整型数据的指针变量
当中存放了整型数组a的首地址
我们可以使用两个表达式p赋值于a
或p赋值为取缔值a[0]
来表示指针变量p指向这个数组首元素
那么
请大家注意我们的数组名是表示数组
首地址的指针常量
即地址常量
那么
对于一个数组
我们就有两种方法可以对数组进行表示
第一种方法就是我们传统上的下标法
我们的取地址运算
我们使用变址运算符来对数组元素
的地址和内容来进行表示
第二种方法是我们的指针法
我们使用指针--指针变量或者是
指针常量来对数组元素来进行表示
对于下标法
我们可以采用指针常量数组名
表示法和指针变量表示法
如a[0]的地址我们可以表示为取缔值a[0]和取缔值p[0]
而a[0]元素的值可以用a[0]和p[0]表示
以此类推a[1]的地址我们可以
表示为取缔值a[1]和取缔值p[1]
而a[1]元素的值
可以直接用a[1]和p[1]表示
a[2]的地址我们可以表示为
取缔值a[2]和取缔值p[2]
取缔值a[2]和取缔值p[2]
取缔值a[2]和取缔值p[2]
而a[2]元素的值可以直接用a[2]和p[2]表示
a[9]的地址我们可以表示
取缔值取缔值a[9]和&p[9]
而a[9]元素的值可以直接用a[9]和p[9]表示
而对于指针法
根据指针+1运算为指向
下一个元素的含义和取内容运算符的含义
我们可得
a[0]元素的地址我们可以用
指针常量和指针变量表示为a+0和p+0
而a[0]元素的值可以用指针法
表示为用*(a+0)和*(p+0)
表示
其中因为0可以省略
所以a[0]元素的地址可用a和p来表示
a[0]元素的内容可用*a和*p来表示
同样a[1]元素的地址我们可以
用指针常量和指针变量表示为a+1和p+1
而a[1]元素的值可以用指针法
表示为用*(a+1)
和*(p+1)表示
a[2]元素的地址我们
可以用指针常量和指针变量
表示为a+2和p+2
而a[2]元素的值可以用指针法
表示为用*(a+2)
和*(p+2)表示
a[9]元素的地址
我们可以用指针常量
和指针变量表示为a+9和p+9
而a[9]元素的值可以用指针法
表示为用*(a+9)
和*(p+9)
表示
所以下标方式的a[i]
p[i]和指针表示的
*(p+i) 和*(a+i)是等价的
下面我们来研究一下指针法
在数组输入输出当中的一个应用
请大家看例题
我们首先定义一个整型的数组a
它有7个元素
我们定义一个的指针变量p
使用p赋值为a表达式
让他指向a[0]
那么我们首先用循环
来对这七个元素进行做输入
常规的方法
我们在循环体语句scanf函数
当中使用的是下标法表达&a[i]
那么在这个程序当中
我们可以用指针法
而由于p指向a[0]
我们可以使用p++这个表达式
输入数据以十进制整型的格式
到p所对应的这个地址里面
然后让p做+1的操作
即p指向下一个元素
下一次再循环输入
那么如图可以看到
我们的指针是不断下移的
到最后一个元素
那么在输出当中
我们的printf函数调用语句当中
输出可以有以前的a[i]等价的写成*(p+i)
但是现在需要注意的一个问题
由图可以看出
我们在上面的输入过程当中
p指针移到到了最后一个元素
那么(p+i)
表达式
当i从0到7时
p+i的指向将是a数组之外
a[6]之后的内存数据
输出的将不是数组a中的数值
这显然是不对的
那么在这道题当中
我们需要对p进行重置
让他在输出之前再次指向a[0]
那么我们在输出之前需要增加表达式p=a
这样我们就用指针法对数组进行了输入输出
今天的内容就讲到这里
在这一节中我们主要学习了
指向一维数组的指针变量
以及对一维数组表示的两种方法
指针法与下标法
以及如何用指针法代替
我们常用的下标法对数组进行
基本的输入输出应用
同学们
我们下次课再见
-计算思维与计算机
--计算思维与计算机
--计算思维与计算机
--计算思维和计算机
-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 二进制文件读写
--二进制文件读写
--二进制文件读写