谭浩强经典c语言学习课件09 指针ppt课件_第1页
谭浩强经典c语言学习课件09 指针ppt课件_第2页
谭浩强经典c语言学习课件09 指针ppt课件_第3页
谭浩强经典c语言学习课件09 指针ppt课件_第4页
谭浩强经典c语言学习课件09 指针ppt课件_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第九章指针 C程序设计中使用指针可以 使程序简洁 紧凑 高效有效地表示复杂的数据结构动态分配内存得到多于一个的函数返回值 9 1地址和指针的概念变量与地址 程序中 inti floatk 内存中每个字节有一个编号 地址 i k 编译时为其分配内存单元将变量名转换为变量的地址 变量是对程序中数据存储空间的抽象 直接访问与间接访问直接访问 按变量地址存取变量值间接访问 通过存放变量地址的变量去访问变量 例i 3 直接访问 2000 3 例 i pointer 20 间接访问 20 3 3 3 地址指向变量的单元C中将地址形象化的称为 指针 变量的地址称为变量的指针 指针与指针变量指针 一个变量的地址指针变量 专门存放变量地址的变量叫 2000 指针 指针变量 变量的内容 变量的地址 例k i 直接访问k i pointer 间接访问 10 例k i k i pointer 与 运算符含义 含义 取变量的地址单目运算符优先级 2结合性 自右向左 含义 取指针所指向变量的内容单目运算符优先级 2结合性 自右向左 两者关系 互为逆运算理解 i pointer 指针变量 它的内容是地址量 i pointer 指针的目标变量 它的内容是数据 i pointer 指针变量占用内存的地址 i pointer ii i pointer 例9 1通过指针变量访问整型变量 main inta b int p1 p2 a 100 b 10 p1 运行结果 100 10100 10 说明 程序中两处出现的 p1 p2的区别地址赋值语句p1 不能写成 p1 a若以执行语句p1 a p1含义是什么 p1 a P2 p1 p2 p1 a的含义是什么 P1 p1 的含义是什么 p1 的含义是什么 例9 2输入两个数 并使其从大到小输出 main int p1 p2 p a b scanf d d 运行结果 a 5 b 9max 9 min 5 5 2006 9 2008 2006 2008 2006 指针变量作为函数参数 地址传递作用 将一个变量的地址传送到另一个函数中 swap intx inty inttemp temp x x y y temp main inta b scanf d d 例 1将数从大到小输出 5 9 5 5 9 COPY 指针变量作为函数参数 地址传递 swap intx inty inttemp temp x x y y temp main inta b scanf d d 例 1将数从大到小输出 值传递 5 9 运行结果 5 9 swap int p1 int p2 intp p p1 p1 p2 p2 p main inta b int pointer 1 pointer 2 scanf d d 5 9 2000 2002 5 9 COPY 5 例9 3将数从大到小输出 swap int p1 int p2 intp p p1 p1 p2 p2 p main inta b int pointer 1 pointer 2 scanf d d 5 9 2000 2002 5 9 例9 3将数从大到小输出 运行结果 9 5 地址传递 swap int p1 int p2 int p p p1 p1 p2 p2 p main inta b int pointer 1 pointer 2 scanf d d 运行结果 9 9 intx int p 例 2将数从大到小输出 5 9 2000 2002 9 9 COPY 假设2000 指针变量在使用前必须赋值 swap intx inty intt t x x y y t main inta b int pointer 1 pointer 2 scanf d d 运行结果 5 9 例 3将数从大到小输出 值传递 5 9 2000 2002 COPY 5 5 9 运行结果 5 9 例 4将数从大到小输出 swap int p1 int p2 int p p p1 p1 p2 p2 p main inta b int pointer 1 pointer 2 scanf d d 5 9 2000 2002 COPY 2000 地址传递 2000 2002 说明 如想通过函数调用得到n个要改变的值在主调函数中设n个变量 用n个指针变量指向它们用指针变量作实参 将n个变量的地址传给索调用的函数的形参通过形参指针变量 改变该n个变量的值主调函数中可以使用这些改变了值的变量注意 不能企图通过改变指针形参的值而使指针实参的值改变 swap int pt1 int pt2 inttemp temp pt1 pt1 pt2 pt2 temp exchange int q1 int q2 int q3 if q1 q2 swap q1 q2 if q1 q3 swap q1 q3 if q2 q3 swap q2 q3 例9 4输入a b c3个数 按大小顺序输出 main inta b c p1 p2 p3 scanf d d d 9 3数组的指针与指向数组的指针变量指向数组元素的指针变量 例intarray 10 int p p 数组名是表示数组首地址的地址常量 通过指针引用数组元素C规定 若P为指向数组元素的指针变量 则P 1指向同一数组的下一个元素P 1 P 1 d d为p指向的变量所占字节数 如果p的初值为 a 0 则 p i和a i就是a i 的地址 a i计算方法同p i p i 或 a i 就是a i 为变址运算符 将a i 按 a i 计算地址 然后找出此地址单元中的内容指向数组的指针变量也可以带下标 如p i 与 p i 等价 数组元素表示方法 变址运算符a i a i a i p i p i a i 例9 5输出数组中的全部元素 main inta 10 i for i 0 i 10 i scanf d main inta 10 i for i 0 i 10 i scanf d main inta 10 i p for i 0 i 10 i scanf d 注意 1 指针变量可以实现使本身的值改变 如p 而a 能否实现呢 2 要注意指针变量的当前值 例9 6通过指针变量输出数组中的元素main inta 10 i p p a for i 0 i 10 i scanf d p for i 0 i 10 i p printf 5d p printf n 指针变量可以指到数组后的内存单元 例9 6通过指针变量输出数组中的元素main inta 10 i p p a for i 0 i 10 i scanf d p p a for i 0 i 10 i p printf 5d p printf n 3 要注意指针变量的运算 P 使P指向下一元素 P 等价于 P P 与 P 的作用不同 P 的含义 如果P当前指向数组a中的第i个元素 则 P 相当于a i P 相当于a i P 相当于a i 例inta 1 2 3 4 5 6 7 8 9 10 p a i 数组元素地址的正确表示 A a 1 B a C p D p i 数组名作函数参数数组名作函数参数 是地址传递形参是用来接收从实参传递过来的数组首地址的 因此 形参应该是一个指针变量 只有指针变量才能存放地址 实际上 C编译都是将形参数组作为指针变量来处理的 f intarr intn 等价于f int arr intn 数组名作函数参数 实参与形参的对应关系为了便于理解 我们可以用数组名作形参实参数组代表一个固定的地址 是指针常量形参数组并不是一个固定的地址 f intarr intn printf d n arr arr arr 3 printf d arr 例9 7将数组a中的n个整数按相反顺序存放 实参与形参均用数组 voidinv intx intn inttemp i j m n 1 2 for i 0 i m i j n 1 i temp x i x i x j x j temp main inti a 10 3 7 9 11 0 6 7 5 4 2 printf Theoriginalarray n for i 0 i 10 i printf d a i printf n inv a 10 printf Thearrayhasbeenreverted n for i 0 i 10 i printf d a i printf n m 4 例9 7将数组a中的n个整数按相反顺序存放 voidinv int x intn inttemp p i j m n 1 2 i x j x n 1 p x m for i p i j temp i i j j temp main inti a 10 3 7 9 11 0 6 7 5 4 2 printf Theoriginalarray n for i 0 i 10 i printf d a i printf n inv a 10 printf Thearrayhasbeenreverted n for i 0 i 10 i printf d a i printf n 实参用数组 形参用指针变量 例9 8从10个数中找出其中最大值和最小值 intmax min voidmax min value intarray intn int p array end array end array n max min array for p array 1 pmax max p elseif p min min p return main inti number 10 for i 0 i 10 i scanf d 实参用数组 形参用指针变量 例9 8从10个数中找出其中最大值和最小值 intmax min voidmax min value int array intn int p array end array end array n max min array for p array 1 pmax max p elseif p min min p return main inti number 10 p number for i 0 i 10 i p scanf d p p number max min value p 10 printf max d min d n max min 实参与形参均用指针变量 一个实参数组 想在函数中改变此数组的元素的值 实参与形参的表示形式有以下几种情况 形参和实参都用数组名实参用数组名 形参用指针变量实参形参都用指针变量实参为指针变量 形参为数组名 例9 9将9 7中实参改为指针变量 voidinv int x intn inttemp p i j m n 1 2 i x j x n 1 p x m for i p i j temp i i j j temp main inti arr 10 p arr for i 0 i 10 i p scanf d p p arr inv p 10 printf Thearrayhasbeenreverted n for p arr p arr 10 p printf d p 实参用指针变量 没有会怎样 例9 9将9 7中实参改为指针变量 voidinv int x intn inttemp p i j m n 1 2 i x j x n 1 p x m for i p i j temp i i j j temp main inti arr for i 0 i 10 i scanf d arr i inv arr 10 printf Thearrayhasbeenreverted n for i 0 i 10 i printf d arr i 只定义指针变量 指针变量作实参必须有确定值 例9 10用选择法对10个整数排序 main inti a 10 p a for i 0 i 10 i scanf d p p a sort p 10 for p a i 0 i 10 i printf d p p 形参用数组 sort intx intn intt i j k for i 0 ix k k j if k i t x i x i x k x k t 例9 10用选择法对10个整数排序 main inti a 10 p a for i 0 i 10 i scanf d p p a sort p 10 for p a i 0 i 10 i printf d p p 形参用指针变量 sort int x intn intt i j k for i 0 i x k k j if k i t x i x i x k x k t 指针变量与数组的关系int p与intq 10 数组名是指针 地址 常量p q p i是q i 的地址数组元素的表示方法 下标法和指针法 即若p q 则p i q i p i q i 形参数组实质上是指针变量 即intq int q在定义指针变量 不是形参 时 不能把int p写成intp 指向多维数组的指针和指针变量多维数组的地址 对于一维数组 1 数组名array表示数组的首地址 即array 0 的地址 2 数组名array是地址常量 3 array i是元素array i 的地址 4 array i array i 对于二维数组 1 a是数组名 包含三个元素a 0 a 1 a 2 2 每个元素a i 又是一个一维数组 包含4个元素 a i 为数组名 inta 3 4 行指针与列指针 对二维数组inta 3 4 有a 二维数组的首地址 即第0行的首地址a i 第i行的首地址a i a i 第i行第0列的元素地址a i j a i j 第i行第j列的元素地址 a i j a i j a i j a i a i a i a i a i 0 值相等 含义不同a i a i 表示第i行首地址 指向行a i a i a i 0 表示第i行第0列元素地址 指向列 二维数组元素表示形式 1 a 1 2 2 a 1 2 3 a 1 2 4 a 0 0 1 4 2 地址表示 1 a 1 2 a 1 0 3 a 1 4 a 1 地址表示 1 a 1 2 2 a 1 2 3 a 1 2 4 a 0 0 1 4 2 注意 在行指针的前面加一个 就转换成列指针 在列指针的前面加一个 就转换成行指针 例9 11输出二维数组的相关值 defineFORMAT d d n main inta 3 4 1 3 5 7 9 11 13 15 17 19 21 23 printf FORMAT a a printf FORMAT a 0 a 0 printf FORMAT 运行结果 66 66 66 66 66 66 58 58 58 58 50 50 50 509 9 指向多维数组的指针变量指向二维数组元素的指针变量 例9 12用指针变量输出数组元素的值 main inta 3 4 1 3 5 7 9 11 13 15 17 19 21 23 int p for p a 0 p a 0 12 p if p a 0 4 0 printf n printf 4d p p a p 例9 12用指针变量输出数组元素的值 main inta 3 4 1 3 5 7 9 11 13 15 17 19 21 23 int p for p a 0 p a 0 12 p if p a 0 4 0 printf n printf o 4d p p 如果要输出指定的元素 可先计算出该元素的相对位置计算数组元素a i j 在数组中的相对位置的计算公式 i m j m为二维数组的列数 例9 13输出二维数组任一行任一列元素的值 main inta 3 4 1 3 5 7 9 11 13 15 17 19 21 23 inti j p 4 p a scanf d d 指向一维数组的指针变量定义形式 数据类型 指针名 一维数组维数 例int p 4 说明 int p 4 定义一个指向一味数组的指针变量pint p 4 与int p 4 不同p的值是一维数组的首地址 p是行指针 p则是列指针 p则是元素的值 例 5二维数组与指针运算 main inta 3 4 1 2 3 4 3 4 5 6 5 6 7 8 inti int p 4 a q a 0 for i 0 i 3 i if i 0 p i i 2 q 1 elsep q for i 0 i 3 i printf d a i i printf d d n p q 运行结果 2 4 7 5 3 2 多维数组的指针作函数参数用指向变量的指针变量用指向一维数组的指针变量用二维数组名 例9 143个学生各学4门课 计算总平均分 并输出第n个学生成绩 main voidaverage float p intn voidsearch float p 4 intn floatscore 3 4 65 67 79 60 80 87 90 81 90 99 100 98 average score 12 search score 2 voidaverage float p intn float p end sum 0 aver p end p n 1 for p p end p sum sum p aver sum n printf average 5 2f n aver voidsearch float p 4 intn inti printf No d n n for i 0 i 4 i printf 5 2f p n i 列指针 行指针 函数说明 floatp 4 p n i 例9 153个学生各学4门课 计算总平均分 并查找一门以上课不及格学生 输出其各门课成绩 p j i 9 4指针与字符串字符串表示形式用字符数组实现 例9 16main charstring IloveChina printf s n string printf s n string 7 用字符指针实现 例9 17main char string IloveChina printf s n string string 7 while string putchar string 0 string 字符指针初始化 把字符串首地址赋给string char string string IloveChina string 0 说明 字符串常量是按字符数组处理的字符指针只能指向一个字符而不能指向多个字符数据用 s输出时 指针变量自动加1 直到字符串结束对字符串的存取可用下标法 也可用指针法 例9 18将字符串a赋值为字符串bmain chara Iamaboy b 20 inti for i 0 a i 0 i b i a i b i 0 printf stringais s n a printf stringbis for i 0 b i 0 i printf c b i printf n 例9 19将字符串a赋值为字符串bmain chara Iamaboy b 20 p1 p2 inti p1 a p2 b for p1 0 p1 p2 p2 p1 p2 0 printf stringais s n a printf stringbis for i 0 b i 0 i printf c b i printf n 字符串指针作函数参数 例9 20用函数调用实现字符串复制 1 用字符数组作参数 2 用字符指针变量作参数 voidcopy string charfrom charto inti 0 while from i 0 to i from i i to i 0 main chara Iamateacher charb Youareastudent printf string a s nstring b s n a b copy string a b printf nstring a s nstring b s n a b voidcopy string char from char to for from 0 from to to from to 0 main char a Iamateacher char b Youareastudent printf string a s nstring b s n a b copy string a b printf nstring a s nstring b s n a b 对copy string函数体可作如下简化While to from 0 to from While to from 0 While from 0 to from to 0 While from to from to 0 While to from While to from 0 For to from 0 For to from 字符指针变量与字符数组char cp 与charstr 20 str由若干元素组成 每个元素放一个字符 而cp中存放字符串首地址charstr 20 str IloveChina char cp cp IloveChina str是地址常量 cp是地址变量cp接受键入字符串时 必须先开辟存储空间 例charstr 10 scanf s str 而char cp scanf s cp 改为 char cp str 10 cp str scanf s cp 字符串与数组关系字符串用一维字符数组存放字符数组具有一维数组的所有特点数组名是指向数组首地址的地址常量数组元素的引用方法可用指针法和下标法数组名作函数参数是地址传递等区别存储格式 字符串结束标志赋值方式与初始化输入输出方式 s c charstr Hello charstr Hello charstr H e l l o char cp Hello inta 1 2 3 4 5 int p 1 2 3 4 5 charstr 10 cp inta 10 p str Hello cp Hello a 1 2 3 4 5 p 1 2 3 4 5 scanf s str printf s str gets str puts str 字符串与数组关系区别指针变量的值是可以改变的 数组名是不可以改变的可以用指针变量代替一个格式字符串 char format format a d b f n printf format a b 9 5函数的指针与指向函数的指针变量函数指针 函数在编译时被分配的入口地址 用函数名表示 函数指针变量赋值 如p max 函数返回值的数据类型 专门存放函数入口地址可指向返回值类型相同的不同函数 指向函数的指针变量定义形式 数据类型 指针变量名 如int p 函数指针变量指向的函数必须有函数说明 函数调用形式 c max a b c p a b 对函数指针变量p n p p 无意义 不能省int p 与int p 不同 例9 23用函数指针变量调用函数 比较两个数大小 main intmax int int inta b c scanf d d main intmax int int p inta b c p max scanf d d 用函数指针变量作函数参数 例9 24用函数指针变量作参数 求最大值 最小值和两数之和 9 6返回指针值的函数函数定义形式 类型标识符 函数名 参数表 例int f intx inty 例9 25指针函数实现 有若干学生成绩 要求输入学生序号后 能输出其全部成绩 main floatscore 4 60 70 80 90 56 89 67 88 34 78 90 66 float search float pointer 4 intn float p inti m printf Enterthenumberofstudent scanf d 例 6写一个函数 求两个int型变量中居于较大值的变量的地址 2 3 2002 2000 例 6写一个函数 求两个int型变量中居于较大值的变量的地址 2002 例 7写一个函数 求两个int型变量中居于较大值的变量的地址 2 3 3 2 例 7写一个函数 求两个int型变量中居于较大值的变量的地址 不能返回形参或局部变量的地址作函数返回值 200A 9 7指针数组和指向指针的指针用于处理二维数组或多个字符串指针数组定义 数组中的元素为指针变量定义形式 数据类型 数组名 数组长度说明 例int p 4 指针所指向变量的数据类型 区分int p 4 与int p 4 指针数组赋值与初始化 指针数组赋值与初始化 charname 5 9 gain much stronger point bye char name 5 gain much stronger point bye 二维数组与指针数组区别 二维数组存储空间固定字符指针数组相当于可变列长的二维数组 指针数组元素的作用相当于二维数组的行名但指针数组中元素是指针变量二维数组的行名是地址常量 main intb 2 3 pb 2 inti j for i 0 i 2 i for j 0 j 3 j b i j i 1 j 1 pb 0 b 0 pb 1 b 1 for i 0 i 2 i for j 0 j 3 j pb i printf b d d 2d n i j pb i 例 8用指针数组处理二维数组 例9 27对字符串排序 main voidsort char name intn print char name intn char name Followme BASIC GreatWall FORTRAN Computer intn 5 sort name n print name n voidsort char name intn char temp inti j k for i 0 i0 k j if k i temp name i name i name k name k temp i 0 voidprint char name intn inti for i 0 i n i printf s n name i 例9 27对字符串排序 main voidsort char name intn print char name intn char name Followme BASIC GreatWall FORTRAN Computer intn 5 sort name n print name n voidsort char name intn char temp inti j k for i 0 i0 k j if k i temp name i name i name k name k temp name 0 name 1 name 2 name 3 name 4 name GreatWall FORTRAN Computer Followme BASIC i 1 例9 27对字符串排序 main voidsort char name intn print char name intn char name Followme BASIC GreatWall FORTRAN Computer intn 5 sort name n print name n voidsort char name intn char temp inti j k for i 0 i0 k j if k i temp name i name i name k name k temp name 0 name 1 name 2 name 3 name 4 name GreatWall FORTRAN Computer Followme BASIC i 2 例9 27对字符串排序 main voidsort char name intn print char name intn char name Followme BASIC GreatWall FORTRAN Computer intn 5 sort name n print name n voidsort char name intn char temp inti j k for i 0 i0 k j if k i temp name i name i name k name k temp name 0 name 1 name 2 name 3 name 4 name GreatWall FORTRAN Computer Followme BASIC i 3 例9 27对字符串排序 main voidsort char name intn print char name intn char name Followme BASIC GreatWall FORTRAN Computer intn 5 sort name n print name n voidsort char name intn char temp inti j k for i 0 i0 k j if k i temp name i name i name k name k temp name 0 name 1 name 2 name 3 name 4 name GreatWall FORTRAN Computer Followme BASIC 指向指针的指针一级指针 指针变量中存放目标变量的地址 例int p1 int p2 inti 3 p2 二级指针 指针变量中存放一级指针变量的地址 例int p inti 3 p 一级指针 单级间接寻址 二级指针 一级指针 目标变量 二级间接寻址 定义形式 数据类型 指针名 如char p 例inti p p p是二级指针 不能用变量地址为其赋值 最终目标变量的数据类型 p是p间接指向对象的地址 p是p间接指向对象的值 例inti 3 int p1 int p2 p1 多级指针 例三级指针int p 四级指针char p 例 9一级指针与二级指针 includevoidswap int r int s int t t r r s s t main inta 1 b 2 p q p 2000 2002 2000 例 9一级指针与二级指针 includevoidswap int r int s int t t r r s s t main inta 1 b 2 p q p 输出 1 2 例 9一级指针与二级指针 inc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论