当前课程知识点:C语言程序设计 >  第9章 指针 >  9.3 指向一维数组的指针变量 >  指向一维数组的指针变量

返回《C语言程序设计》慕课在线视频课程列表

指向一维数组的指针变量在线视频

下一节:指向二维数组的指针变量

返回《C语言程序设计》慕课在线视频列表

指向一维数组的指针变量课程教案、知识点、字幕

同学们好

在这节当中

我们将和大家一起探讨

指向一维数组的指针变量

以及对一维数组表示的两种方法

指针法与下标法

以及如何用指针法代替我们常用的

下标法对数组进行基本的输入输出应用

首先我们来看什么是数组指针就是数组的地址

由于数组在内存中占据了一组连续的存储单元

因此数组指针指的是数组的起始地址

首地址

也就是第一个数组元素的地址

如果一个指针变量中存放了数组

的地址我们就称之为该指针变量指向了某数组

即这个指针变量是指向数组的指针变量

如我们定义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

这样我们就用指针法对数组进行了输入输出

今天的内容就讲到这里

在这一节中我们主要学习了

指向一维数组的指针变量

以及对一维数组表示的两种方法

指针法与下标法

以及如何用指针法代替

我们常用的下标法对数组进行

基本的输入输出应用

同学们

我们下次课再见

C语言程序设计课程列表:

第1章 C语言程序设计预备知识

-计算思维与计算机

--计算思维与计算机

--计算思维与计算机

--计算思维和计算机

第2章 C语言程序设计基础

-2.1 程序设计语言的发展及其特点和应用

--程序设计语言的发展及其特点和应用

--程序设计语言的特点及发展

- 2.2 C语言程序的基本结构及编制C语言程序的基本步骤

-- C语言程序的基本结构及编制C语言程序的基本步骤

--C语言程序的结构和编制步骤

第3章 基本数据类型、运算符与表达式

-3.1 C语言的数据类型

--C语言的数据类型

--C语言的数据类型

-3.2 常量

--常量

--常量

-3.3 什么是变量

--什么是变量

--什么是变量

-3.4 如何进行算术运算

--如何进行算术运算

--如何进行算术运算

-3.5 赋值运算符和逗号运算符

--赋值运算符和逗号运算符

--赋值运算符和逗号运算符

-3.6 数据类型转换

--数据类型转换

--数据类型转换

第4章 基本输入输出和顺序程序设计

-4.1 格式化输出printf

--格式化输出printf

--格式化输出

-4.2 格式化输入scanf及字符数据的非格式化输入输出

--格式化输入scanf及字符数据的非格式化输入输出

--格式化输入

第5章 选择结构程序设计

-5.1 关系运算符和关系表达式

--关系运算符和关系表达式

--关系运算符和关系表达式

-5.2 逻辑运算符和逻辑表达式

--逻辑运算符和逻辑表达式

--逻辑运算符和逻辑表达式

-5.3 条件运算符和条件表达式

--条件运算符和条件表达式

--条件运算符和条件表达式

-5.4 if语句

--if语句

--if语句

-5.5 switch语句

--switch语句

--switch语句

第6章 循环结构程序设计

-6.1 while语句

--while语句

--while语句

--do-while语句

-6.2 for语句

--for语句

--for语句

-6.3 循环的嵌套

--循环的嵌套

--循环的嵌套

-6.4 break语句和continue语句

--break语句和continue语句

--break和continue语句

第7章 数组

-7.1 一维数组的定义和引用

--一维数组的定义和引用

--一维数组的定义和引用

-7.2 一维数组的赋值

--一维数组的赋值

--一维数组的赋值

-7.3 二维数组的定义和引用

--二维数组的定义和引用

--二维数组的定义和引用

-7.4 二维数组的赋值

--二维数组的赋值

--二维数组的赋值

-7.5 字符串的本质

--字符串的本质

--字符串的本质

-7.6 字符串操作的常用函数

--字符串操作的常用函数

--字符串常用函数

-7.7 字符串数组

--字符串数组

--字符串数组

第8章 函数

-8.1 函数概述

--函数概述

--函数概述

-8.2 有参函数

--有参函数

--有参函数

-8.3 函数参数的传递方式

--函数参数的传递形式

--函数参数的传递方式

-8.4 变量的作用域和生存期

--变量的作用域和生存期

--变量的作用域和生存期

-8.5 变量的存储类型

--变量的存储类型

--变量的存储类型

-8.6 函数的嵌套和递归调用

--函数的嵌套和递归调用

--函数的嵌套和递归调用

-8.7 函数的作用域与封装

--函数的作用域与封装

--函数的作用域与封装

第9章 指针

-9.1 指针变量的概念(上)

--指针变量的概念(上)

--指针变量的概念(上)

-9.2 指针变量的概念(下)

--指针变量的概念(下)

--指针变量的概念(下)

-9.3 指向一维数组的指针变量

--指向一维数组的指针变量

--指向一维数组的指针变量

-9.4 指向二维数组的指针变量(上)

--指向二维数组的指针变量

--指向二维数组的指针变量(上)

-9.5 指向二维数组的指针变量(下)

--指向二维数组的指针变量(下)

--指向二维数组的指针变量(下)

-9.6 动态内存分配

--动态内存分配

--动态内存分配

第10章 预处理命令

-10.1 编译预处理

--编译预处理

第11章 复杂数据类型

-11.1 用户自己建立数据类型

--用户自己建立数据类型

--用户自己建立数据类型

-11.2 定义结构体类型变量

--定义结构体类型变量

--定义结构体类型变量

-11.3 结构体变量的引用与初始化

--结构体变量的引用与初始化

-11.4 结构体数组

--结构体数组

--结构体数组

-11.5 指向结构体类型数据的指针

--指向结构体类型数据的指针

--指向结构体类型数据的指针

第12章 文件

-12.1 文件的基本概念和文件指针

--文件的基本概念和文件指针

--文件的基本概念和文件指针

-12,2 文件的打开和关闭

--文件的打开和关闭

--文件的打开和关闭

-12.3 文本文件读写

--文本文件读写

--文本文件读写

-12.4 二进制文件读写

--二进制文件读写

--二进制文件读写

指向一维数组的指针变量笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。