c语言程序设计指针,C语言程序设计(指针).pdf

c8da8f5a7cda2d62dda9e5a200b168b9.gifC语言程序设计(指针).pdf

1 第第6章章 指针指针 C C语言程序设计课程组语言程序设计课程组 魏慧琴魏慧琴 指针和变量指针和变量 指针和数组指针和数组 指针和函数指针和函数 字符指针字符指针 案例学习案例学习 学习内容学习内容 第一单元第一单元 指针指针和指针变量和指针变量 地址和指针地址和指针 指针变量的定义指针变量的定义 指针变量的引用指针变量的引用 3 内存单元和地址内存单元和地址 运行程序时程序、数据都存在内部存储器运行程序时程序、数据都存在内部存储器 内部存储器有很多存储单元组成内部存储器有很多存储单元组成 每个存储单元有自己独有的地址,称每个存储单元有自己独有的地址,称内存地址内存地址 4 在程序中所定义的变量,编译系统会根据变量的类在程序中所定义的变量,编译系统会根据变量的类 型,分配不同长度的内存。型,分配不同长度的内存。 当变量只占用一个字节,该字节的地址就是变量的地址当变量只占用一个字节,该字节的地址就是变量的地址 当变量只占用连续若干字节,第一个字节的地址就是变当变量只占用连续若干字节,第一个字节的地址就是变 量的地址量的地址 如如 在在VC 中中 char ch; 1个字节个字节 inta ; 4个字节个字节 float b ; 4个字节个字节 3 2000- 2003 2008- 2011 5.0 a b A1000 ch 变量名变量名数据类型数据类型变量地址变量地址 ch字符型字符型1000 a整型整型2000 b单精度实型单精度实型2008 变量与地址变量与地址 5 直接访问方式直接访问方式 按变量的地址存取变量的值按变量的地址存取变量的值 。。 访问变量的方式访问变量的方式 int a; float b; a 3; b 5; 35.0 20002008 a b 将将3送入变量送入变量a所占据的内存所占据的内存单元(地址单元(地址2000)) 6 间接访问方式间接访问方式 按变量的地址的地址存取变量的值。按变量的地址的地址存取变量的值。 35 20002008 定义变量定义变量p p,存放,存放a a的地址,通过的地址,通过p p访问访问a a int a; float b; a 3; b 5; 2000 ab 3000 指针指针 指针变量是存放地址的变量指针变量是存放地址的变量 指针变量指针变量 访问变量的方式访问变量的方式 7 例如用变量例如用变量p p来来存放变量存放变量a a的地址的地址 char *ps; float *pf1,*pf2; 11 指针变量的值为地址,可理解为无符号的整数,但指针变量的值为地址,可理解为无符号的整数,但不能直接将整型不能直接将整型 常量赋给指针变量常量赋给指针变量 用相同类型的指针变量赋值用相同类型的指针变量赋值 用变量的地址给指针变量赋值用变量的地址给指针变量赋值 求地址运算符求地址运算符 p 如int a, *p1, *p2; p1 p2 p1; 如p NULL; 或或p 0;; 指针变量的定义指针变量的定义 12 危险危险 如int *p1 NULL; float a; float *p2 char ch, *p3 int a,*p; float b; a 3; b a; *pa; 注若不赋值,则指针变量注若不赋值,则指针变量 的值是随机的的值是随机的 指针变量的初始化方法指针变量的初始化方法 赋空值赋空值NULLNULL 用已定义的变量的地址用已定义的变量的地址 指针变量的定义指针变量的定义 13 示例示例 int a,b; int *p1,*p2; p1 p2 p1 p2 a b 指针变量的定义指针变量的定义 14 指针运算符(指针运算符(* *)和取地址运算符()和取地址运算符( *p就是变量就是变量a 指针变量的引用指针变量的引用 15 通过通过指针变量访问所指变量两步指针变量访问所指变量两步 将指针变量指向被访问的变量将指针变量指向被访问的变量 指针变量指针变量 访问所指变量访问所指变量 取内容取内容b*pb*p;; 如printfdn,*p; *p10; printfad bdn,*p,b; 注意注意 * *p p若出现在若出现在的的右右边或其他表达式中则为边或其他表达式中则为取取,, 若若出现在出现在的的左左边则为边则为存存。。 a10 b5 指针变量的引用指针变量的引用 16 include void main int a,*pi; float f,*pf; char st,*pc; pi pfpc *pi10; *pf1.5; *pca; printfd,f,cn,a,f,st; printfd,f, cn,*pi,*pf,*pc; 单击鼠标,演示程序的 执行过程 例6.1 pi pf pc a f st int *p; p b *p; printf dn, b; *p 4; printf dn, a; 等价于等价于pa 指针变量指针变量 非指针变量非指针变量 思考下列表达式是何含义有什么思考下列表达式是何含义有什么 要求要求 int t; printfd dn, a, b; t a; a b; b t; printfd dn, a, b; include void main int a 3, b 6; int *pa int t; printfd dn, a, b; t *pa; *pa *pb; *pb t; printfd dn, a, b; 指针变量的引用指针变量的引用 19 includeinclude voidvoid mainmain intint a,ba,b,*p,*p,*p,*p1 1,*p,*p2 2; ; aa3 3; ;bb6 6; ; p p1 1 ; p p2 2 ; pppp1 1; ; p p1 1pp2 2; ; p p2 2pp; ; printfprintfd dd d n,*p1,*p2;n,*p1,*p2; printfprintf d d d d n,a,bn,a,b ; ; 单击鼠标,演示程序的执 行过程 p1 p2 p a b a是数组首地址,是地址常量是数组首地址,是地址常量, a pa错误错误 25 for pa; pa10; p printfd ,*p; 例例1 1 数组元素的引用数组元素的引用 include void main int a10,i; for i0; i10; i aii; fori0;i10;i printfd ,ai; *ai int *p; forpa,i0;i10; i,p *pi; 引用数组元素的方法引用数组元素的方法 26 练习(数组的使用)练习(数组的使用) include void main int i, a5, *p a; printf 5 numbersn; for i 0; i 5; i scanf d, printf Output these numbersn; for i 0; i p2的结果的结果为为0((真)真) p2a的结果为的结果为1(真)(真) 指向一维数组指向一维数组指针变量的计算指针变量的计算 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 p1 p2 34 include int mainvoid int i, a10, *p; long sum 0; printfEnter 10 integers ; fori 0; i 10; i scanfd, forp a; p a9; p sum sum *p; printfsumld n, sum; return 0; 例例2 2 使用指针计算数组元素之和使用指针计算数组元素之和 Enter 10 integers 10 9 8 7 6 5 4 3 2 1 sum55 p3000 a0 地址内容数组元素 3002 a1 3018 a9 ai a a1 a9 ai p p p 35 第三单元第三单元 指针与函数指针与函数 指针作为函数参数指针作为函数参数 36 函数返回指针函数返回指针 函数指针函数指针 37 指针作为函数参数指针作为函数参数 简单变量作函数的参数简单变量作函数的参数,,在函数调用时是按在函数调用时是按 值传送值传送 方式传递参数的方式传递参数的单向传递单向传递。。 指针变量存放的是指针变量存放的是 地址地址 ,,作函数的参数作函数的参数,,在函数调在函数调 用时按用时按 值传送值传送 方式传递参数方式传递参数双向传递双向传递。。((即即 通过通过 传值传值 完成完成 地址地址 的传递的传递)) 例例1 编写编写一个函数实现两个数的交换一个函数实现两个数的交换 include void swap int x, int y int t; t x; x y; y t; void main int a 3, b 5; swap a, b; printf d dn, a, b; 3 5 a b x y 4012 4610 3 5 5 3 38 指针作为函数参数指针作为函数参数 39 程序变化 include void swap int *x, int *y int t; t *x; *x *y; *y t; void main int a 3, b 5; swap printf d dn, a, b; 3 5 a b 2A02 2C16 x y 4012 4610 2A02 2C16 3 5 指针作为函数参数指针作为函数参数 40 程序变化 include void swap int *x, int *y int t; t *x; *x *y; *y t; void main int a 3, b 5; swap printf d dn, a, b; int *t; t x; x y; y t; 2A02 2C16 4012 4610 5 3 a b 2A02 x y 2C16 2A02 2C16 指针作为函数参数指针作为函数参数 41 程序变化 include void swap int *x, int *y int t; t *x; *x *y; *y t; void main int a 3, b 5; swap printf d dn, a, b; int *t; *t *x; *x *y; *y *t; t是是不确定的值,用不确定的值,用*t可能可能破破 坏系统的正常工作状态。坏系统的正常工作状态。 t 42 示例示例 输出两数中的大者输出两数中的大者 include void maxint *p1,int *p2 int t; t *p1; *p1 *p2; *p2 t; void main int a,b; int *pa,*pb; printf输入输入a 和和 bn; scanfd,d, pa pb ifab maxpa,pb; printfmaxd n,a; 指针作为函数参数指针作为函数参数 43 练习练习1 1阅读源程序,写出运行结果阅读源程序,写出运行结果 include void subint x, int y, int *z *zy-x; void main int a,b,c; sub9,5, sub3,a, suba,b, printfd,d,dn,a,b,c; 注意注意指向指向变量的指针变量做变量的指针变量做 参数,如何进行参数的参数,如何进行参数的传递。传递。 -4,-7,-3 指针作为函数参数指针作为函数参数 44 函数返回指针函数返回指针 函数的返回值可以是整型的函数的返回值可以是整型的、、实型的实型的,,也可以返回指针也可以返回指针。。 与一般函数的定义不同之处是在函数名的前面加了一个与一般函数的定义不同之处是在函数名的前面加了一个 * *号号。。这就是能够返回指针的函数这就是能够返回指针的函数。。 45 定义形式定义形式 类型说明符类型说明符* *函数名函数名 参数说明参数说明 函数体函数体 示例示例 int *searchint *x , int n int *p; pxn; returnp; /* /* 函数的返回值为指向整型的指针。函数的返回值为指向整型的指针。* */ / 函数返回指针函数返回指针 46 例例 用返回指针的函数来实现输出两个数中的最大值。用返回指针的函数来实现输出两个数中的最大值。 include int *maxint *p1,int *p2 int *r; if*p1 *p2 r p1; else r p2; return r; void main int a,b,,*p; printf输入输入a 和和 bn; scanfd,d, pmax printfmax d,*p; 函数返回指针函数返回指针 47 一个函数在内存中占一片存储一个函数在内存中占一片存储 空间空间 。在函数被编译时,被分配。在函数被编译时,被分配 给一个入口地址,这个给一个入口地址,这个入口地址入口地址就就 称为称为函数的指针函数的指针。。 用一个指针变量指向函数,然用一个指针变量指向函数,然 后用后用指向函数的指针变量代替指向函数的指针变量代替函数函数 名名来调用这个函数来调用这个函数。。 函数指针函数指针 void swap // void main // swap入口地址入口地址 main入口地址入口地址 48 函数指针定义形式函数指针定义形式 类型说明符类型说明符**变量名变量名 ; ; 例如例如intint*p ;*p ; /*/*定义了一个指向函数的指针变量定义了一个指向函数的指针变量p p,函数的返回值是整型。,函数的返回值是整型。* */ / 函数的调用形式函数的调用形式 ((* *指针变量)(实参表列指针变量)(实参表列;; 例如例如*p *p a,ba,b ;; 注意 与与 int *p int *p 的区别的区别 函数指针函数指针 49 include int maxint x,int y int z; zxy xy; returnz; void main int *pint,int, a , b , m; pmax;/*/*为函数指针赋初值为函数指针赋初值* */ / scanfd,d, m*pa,b;/*/*a,ba,b做实参,调用做实参,调用maxmax函数函数* */ / printfnad,bd,maxdn,a,b,m; m*pa,b; mmaxa,b;; 例例1 1求求a,ba,b中的最大者中的最大者 函数指针函数指针 第四单元第四单元 字符指针字符指针 字符串的表示形式字符串的表示形式 字符数组与字符指针的区别字符数组与字符指针的区别 字符指针应用举例字符指针应用举例 50 用字符数组实现用字符数组实现 如如staticstatic charcharssVCVC 6 6. .0 0 ;; 用字符指针实现用字符指针实现 如如char char * *pspsVC 6.0VC 6.0;; 或或char *char *psps; ; psps VC 6.0 VC 6.0;; 字符串的表示形式字符串的表示形式 sps Vs0V Cs1C s2 s3 6s4 6 .s5 . 0s6 0 0s7 0 51 1.1.字符字符数组可以存字符串,存的是字符;而字数组可以存字符串,存的是字符;而字 符串指针变量存的是字符串在内存的首地址。符串指针变量存的是字符串在内存的首地址。 2.2.赋值赋值方式不同前者一次只赋一个字符,方式不同前者一次只赋一个字符, 要赋若干次;后者只赋值一次,赋的是要赋若干次;后者只赋值一次,赋的是地址地址。。 I love this game0 变量p 数组a 300A 300A 如char a Hello; char *b, *p Hello; b Hello; 如char *p abcd; putchar p3; 3.3.可以可以象数组那样用下标形式引用指针变量所象数组那样用下标形式引用指针变量所 指字符串中的指字符串中的字符。字符。 字符数组与字符指针的区别字符数组与字符指针的区别 52 如果要改变数组所代表的字符如果要改变数组所代表的字符 串,只能改变数组元素的内容串,只能改变数组元素的内容 如果要改变指针所代表的字符如果要改变指针所代表的字符 串,通常直接改变指针的值,让串,通常直接改变指针的值,让 它指向新的字符串它指向新的字符串 53 char sa This is a string; char *sp This is a string; strcpy sa, Hello; sp Hello; sa “Hello”; 非法非法 数组名是常量,不能对它赋值数组名是常量,不能对它赋值 字符数组与字符指针的区别字符数组与字符指针的区别 定义字符指针后,如果没有对它赋值,指针的值定义字符指针后,如果没有对它赋值,指针的值不确定不确定。 char *s ; scanf“s”, s; char *s, str20; s str; scanf“s”, s; 定义指针时,先将它的初值置为空 char *s NULL 不要引用未赋值的指针不要引用未赋值的指针 字符指针应用字符指针应用 例例1 1 用指向字符串的指针变量实现字符串的输出用指向字符串的指针变量实现字符串的输出。。 includeinclude voidvoid mainmain charchar sVCsVC 6 6. .0 0 ,,* *p p; ; p p s s; ; printfprintf s s n,sn,s ; ; printfprintf s s n,pn,p ; ; 字符指针应用举例字符指针应用举例 55 include void main char *s1VC 6.0; s12; printfsn,s1; 例例2 2输出输出字符串中的部分数据字符串中的部分数据 运行运行结果结果 6.0 56 将s1定义为字符数组是否还可 以进行这样的操作 字符指针应用举例字符指针应用举例 include void main char a20,b20,*p1,*p2; getsa; p1 a; p2 b; for ; *p1 0; p1,p2 *p2 *p1; *p2 0; printfstring a is sn,a; printfstring b is sn,b; 例例3 3 将将字符串字符串a a复制到字符串复制到字符串b b。。 a0b0 0 a0 P1P2 0 P1P2 P1 P2 strcpy p2 , p1 ;; 57 字符指针应用举例字符指针应用举例 define MAXLINE 100 void encryptchar *s; int main void char line MAXLINE; printf the string ; getsline; encrypt line; printf “After being encrypted sn, line; return 0; 例例4 4 加密问题。加密问题。为了防止信息泄密,将电码明文通过加密方式变换成为为了防止信息泄密,将电码明文通过加密方式变换成为 密文。如将小写字母密文。如将小写字母a a变成变成b,zb,z变成变成a,a,其他字符不变。其他字符不变。 字符指针应用举例字符指针应用举例 58 加密函数的两种实现加密函数的两种实现 void encrypt char s int i; fori 0; si 0; i if si z si a; else si si1; void encrypt char *s for ; *s 0; s if *s z *s a; else *s *s1; the stringhe will come in 2 days After being encrypted if xjmm dpnf jo 2 ebzt 字符指针应用举例字符指针应用举例 59 60 函数的函数的入口地址入口地址就称为就称为函数的指针函数的指针。。 用一个指针变量指向函数,然后用用一个指针变量指向函数,然后用指向函数的指针变量代指向函数的指针变量代 替替函数名函数名来调用这个函数来调用这个函数。。 函数指针定义形式函数指针定义形式 类型说明符类型说明符**变量名变量名 ; ; 函数的调用形式函数的调用形式 ((* *指针变量)(实参表列指针变量)(实参表列;; 第五单元第五单元 案例学习案例学习 案例学习指向函数的指针案例学习指向函数的指针 例例1 1 设设一个函数一个函数processprocess,, 在调用它的时候,每次实在调用它的时候,每次实 现不同的功能现不同的功能。。 11求求a a和和b b之之和和 22指指a a,,b b中大中大者者 33求求a a,,b b中小中小者者 int addint x,int y int z; zxy; returnz; 函数指针函数指针 61 int minint x,int y int z; ifxy zx; else zy; returnz; 函数指针函数指针 62 include void main int a,b; printfplease a and bn; scanfd,d, printfsum; processa,b,add; printfmax; processa,b,max; printfmin; processa,b,min; void processint x,int y, int *funint,int int result; result*funx,y; printfdn,result; 函数指针函数指针 63 64 说明说明 用指向函数的指针作函数参数的优越性在于能在调用用指向函数的指针作函数参数的优越性在于能在调用 一个函数过程中执行所指定的函数,从而增加处理问题的一个函数过程中执行所指定的函数,从而增加处理问题的 灵活性。灵活性。 在处理不同函数时,在处理不同函数时,process函数本身并未改变,而只函数本身并未改变,而只 是改变了调用它的是改变了调用它的实参实参。如果将另一个函数传给。如果将另一个函数传给process,, 只需改变一个实参值即可。只需改变一个实参值即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值