当前课程知识点:高级语言程序设计 > 指针 > 6.5 指针与一维数组 > 指针与一维数组
大家好
本节课我们来学习如何用指针引用数组
在函数间共享数组是常见的
如何通过指针来引用数组
是我们c程序中必须要掌握的
我们先来看看
我们如何利用指针来引用一维数组
我们看一个例子
int a[10]初始化
数组a10个元素初始化
1,3,5,7,9,11,13,15,17,19
int *p
然后我们把a赋值给p
在这里数组名a是一个常量指针
它是一个int *类型的指针
所以a和p这两个指针类型相同
无非p是一个指针变量
a是一个指针常量
我们把a赋值给p
那么这是正确的
是允许的
是合法的
我们看看这个右边的这个示意图
a就是整个这个数组
这块连续存储区域的首地址
那么当我们把数组名a赋值给p之后
那也就是把a[0]的地址
也就是a那么赋值给了p
P就指向这块数组的连续存储区的第一个元素
它也是这块连续存储区的首地址
p的值就是
在这里p a a[0]的地址均指向同一个地方
它们都是数组占据的这一块
连续存储区的首地址
也是数组中下标为0的元素a[0]的首地址
不同的是
p是变量
a a[0]的地址都是常量
那么我们看一看
接着P+1
由于p的值指向a[0]
那P+1就指向数组中的第二个元素
指向值为3的
也就是a[1]
那么根据指针的运算
我们就可以有如下的这样一个推导表
P在这里它的值是a
也是a[0]的地址
那p+1对应的就是a+1
它就是a[1]的地址
p+2就相当于a+2
它对应的是a[2]的地址
p+i那么就可以推断出来
它就相当于a+i
它是a[i]这个元素的地址
那对p指向对象
也就是*p
*p就相当于*a
由于a是这块数组区域的首地址
它的类型是int类型的指针
因此*a访问的是a[0]
那同样我们可以推断出来
P+1它指向的对象相当于a+1 就是a[1]
P+2它指向的对象a[2]
相当于a+2指向的对象
同样P+i指向的对象和a+i指向的对象是一回事
因为它这里p的值就是a
那么它指向的对象就是a[i]
因此*(p+i)访问的就是a[i]
那么这个推导就是要告诉我们
一旦我们把数组的首地址赋值给了一个指针
这个指针的类型恰好是和元素
它指向的对象的类型和元素的类型一样
那么p+i它的值就是a[i]的地址
p+i指向的对象访问的就是a[i]
因为a[i]等效于*(a+i)的指向对象
所以*(p+i)指向的对象我们也可以写成p[i]
这样我们能用这个知识
我们就能够通过指针变量来访问一维数组元素
我们看一个例子
方法一 用下标法来访问数组
这是我们前面学的数组这一章的访问方法
那么程序代码是
#include
int main( )
花括号里面int a[10],i
那么输出一个提示
请输入数组中的元素
for(i=0;i<10; i++)
那么输入值给a[i]
再输出一个提示
我们输出数组中的元素
for(i=0;i<10; i++)
需要printf 格式输出函数来输出a[i]的值
那么整个数组
这样我们就把元素进行了输入和输出
进行了一次存储
那么这是用前面数组学的知识
数组名加下标这种方法
来访问数组中的元素的
那么我们学了刚才的指针的知识之后
我们就可以用指针的知识
来访问数组中的元素
我们来看一看实例是怎样的
来体会一下
用指针变量存储一维数组元素
这前面是一样的
#include
int main( )
花括号 int a[10],i
我们多定义一个指针变量*p
当我们把数组中的首地址a赋值给p的时候
那么我们输入原来是用a[i]取地址
我们就可以改成p+i
因为刚才我们推导p+i就是a[i]的地址
同样我们输出的时候
用a[i]在这里就可以改成
p+i指向的对象*(p+i)
这样就可以输出a[i]的值
那么我们用指针p
就可以输出 输入
输出整个数组a
对一维数组的元素实现存储
那么我们可以更进一步
对于这个指针p
由于p是指针变量
让p的值变化
我们不需要a
可以让p的值变化
像#include
int main( )
花括号 int a[10],i,*p;
这是刚才的这个指针方法
把a赋值给p之后
我们用p+i 变化一下
由于p是指针变量
我们不要i
让p的值发生变化
把a赋值给p在这里
然后我们每一次完成输入之后
那么p的值增加一个
那就指向下一个数组元素
那么它的条件也改为p
因为最多我们只能访问到a[9] 同样输出的时候 我们不需要a 我们直接利用p for
-1.1 计算机程序和计算机语言
-1.2 C程序的构成
--C程序的构成
-1.3 C语言编辑、编译、运行(VC++2010学习版)
-练习题
-2.1 变量的定义和使用
--变量的定义和使用
-2.2 数据类型
--数据类型简介
--整型数据
--实型数据
-2.3 格式输出和格式输入
-2.4 运算符和表达式
--运算符和表达式
-2.5 结构化程序设计入门
-练习题
-3.1 为什么要用选择结构解决问题
-3.2 如何正确表示选择结构中的条件
-3.3 用if语句及if语句嵌套实现选择结构
-3.4 用switch语句实现选择结构
-练习
-4.1 循环的引入
-4.1 循环的引入--作业
-4.2 用while语句实现循环
-4.3 用do-while语句实现循环
-4.4 用for语句实现循环
-- 用for语句实现循环
-4.4 用for语句实现循环--作业
-4.5 何时需要用循环的嵌套
-4.6 如何提前终止循环和提前结束本次循环
-习题--作业
-5.1 数组类型的引入
--数组类型的引入
-5.2 一维数组的定义和初始化
-5.3 一维数组的使用
--一维数组的使用
-5.4 二维数组的定义和初始化
-5.5 二维数组的使用
--二维数组的使用
-习题--作业
-6.1 什么是指针
--什么是指针
-6.2 指针类型及相关概念
-6.3 指针变量的定义、赋值与使用
-6.4 指针的运算
--指针的运算
-6.5 指针与一维数组
--指针与一维数组
-6.6 指针的指针
--指针的指针
-6.7 指针与二维数组
--指针与二维数组
-习题--作业
-7.1 为什么要自定义函数
-7.2 函数的定义
--函数的定义
-7.3 函数的调用
--函数的调用
-7.4 函数参数的传递
--函数参数的传递
-7.5 函数的嵌套调用和递归调用
-7.6 变量的作用域和存储类型
-习题--作业
-8.1 字符串的存储及输入输出
-8.2 系统字符串处理函数
-8.3 自定义字符串处理函数
-习题--作业
-9.1 结构体类型的定义
--结构体类型的定义
-9.2 结构体变量及指针变量的定义及使用
-9.3 结构体变量和指针变量作函数的参数
-9.4 结构体数组的定义和使用
-9.5 共用体类型和枚举类型
--共用体和枚举类型
-习题--作业
-动态内存分配--习题
-习题--作业