




免费预览已结束,剩余44页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
c语言程序设计,第 8 讲,第8章 指针,c程序设计中使用指针可以: 有效地处理数组,字符串 有效地处理复杂的数据结构 扩展函数的功能 对内存实行动态分配,程序中: int x=10; float k;,内存中每个字节有一个编号-地址,10,编译或函数调用时为其分配内存单元,变量是对程序中数据 存储空间的抽象,第8章 指针,8.1 基本概念,变量的内容,变量的地址,指针与指针变量 指针:一个数据或变量在内存中的首地址 指针变量:专门存放变量地址的变量叫,4000,指针,指针变量,变量的内容,变量的地址,变量的内容,x=100,p=&x,第8章 指针,8.2.1 指针变量的定义 8.2.2 指针变量的引用 8.2.3 指针定义与引用的有关说明 8.2.4 指针变量作为函数形参,8.2 指针的定义和引用,第8章 指针,8.2.1 指针变量的定义,指针变量的定义 一般形式: 基本类型标识符 *指针变量名列表;,合法标识符,表示定义指针变量 不是*运算符,c语言的基本类型名,例 char *p1; int *p2,*p3 ;,注意: 1、指针变量名是p1,p2 ,p3不是*p1,*p2,*p3 2、指针变量的类型是根据指针变量所指向单元中存放的 值的类型来确定的 3、一个指针变量在内存中也要占用内存单元,第8章 指针,8.2.2 指针变量的引用,指针变量必须先赋值,再使用,例 int *p; p=4000;,但,不合法,指针变量赋值有两种方法: 1、将某个已经定义了的普通变量的首地址赋给指针变量; 2、调用c语言的动态内存分配函数或运算符为指针变量在内存的动态存储区找到一个可用区域。,第8章 指针,8.2.2.1 指向变量的指针,&与*运算符 含义,含义: 取变量的地址 单目运算符 优先级: 2 结合性:自右向左,含义: 取指针所指向变量的内容 单目运算符 优先级: 2 结合性:自右向左,两者关系:互为逆运算 理解,例8.1 指针变量的基本用法: #include void main() int x , y ; /定义两个普通变量 int *p1, *p2; /定义两个指针变量 p1= ,运行结果:x=100,*p1=100 y=200,*p2=200,第8章 指针,使用指针变量的一般步骤为: 1)先定义指针变量和同类型的普通变量,如:int *p,x; 2)使用取地址运算符“ 3)此后,使用*p即可取代变量x 。,8.2.2.1 指向变量的指针,直接访问与间接访问 直接访问:使用普通变量名(例如上例中的变量 x和y)来访问某个数据 间接访问:使用指针变量来访问某个数据,第8章 指针,1.同其他变量一样,在定义指针变量的同时,可以对 其初始化。例如:int x; int *p=,8.2.3 指针定义与引用的有关说明,2.两个指针变量指向同一变量或同一内存单元。 注意:只有同类型的两个指针变量,才允许将其中 一个指针变量存放的地址直接赋给另一个指针变量。,3.注意“p2=p1”和“*p2=*p1”的区别。 “p2=p1”是将两个指针变量p1和p2指向同一变量或同一 内存单元,而“*p2=*p1”,则是将指针变量p1所指向 的内存单元的内容存放到指针变量p2所指向的内存空 间。,例8.3交换变量x和y的值: #include void main() int x,y,temp,*p1,*p2; x=100; y=200; p1= ,输出结果为: x=200 y=100,将例8.3中的程序改写为: #include void main() int x,y,*temp,*p1,*p2; x=100; y=200; p1= ,运行结果为: x=100 y=200 (想一想,为什么?),第8章 指针,4.p+、*p+、(*p)+的区别,8.2.3 指针定义与引用的有关说明,1) p+(指针加1)的功能 p+(指针加)不是地址的具体值加, 而是将指针指向与之相临的下一个数据。,2)*p+的功能 例如:语句“x=*p+;”,等价于 : x=*p;p+;,3)(*p)+的功能 将p所指向的内存单元的值加1。,第8章 指针,1、将指针变量所指向的内存单元的值作为函数的形参,8.2.4 指针变量作为函数形参,例8.4 通过函数求任意三个整数的最大值。 #include int max(int a,int b,int c) int n; if (ab) n=a; else n=b; if (nc) n=c; return (n); void main() int x,y,z,m,*p1,*p2,*p3; p1= ,第8章 指针,2、将指针变量作为函数的形参地址传递,8.2.4 指针变量作为函数形参,特点:共享内存,“双向”传递,例8.5 通过函数求任意三个整数的最大值。 #include void max(int a,int b,int c,int *p) int n; if (ab) n=a; else n=b; if (nc) n=c; *p=n; void main() int x,y,z,m,*pm; scanf(“%d%d%d“,p1,p2,p3); pm= ,第8章 指针,3使函数返回多个函数值的一般方法,8.2.4 指针变量作为函数形参,1)在主程序设置n个普通变量x1、x2、x3和n个指 针变量p1、p2、p3,2)将n个指针变量指向这n个普通变量。即: p1=,3)然后将这n个指针变量作为实参,将其地址传递给 所调用的自定义函数的形参。,4)在自定义函数中,除了接受主函数传递运算数的m个形参外, 再设置n个指针变量作形参,用来接受由主函数main传递来 的n个地址,这样,在自定义函数中,可以通过改变自定义 函数中所定义的这些形参指针变量所指向的内存单元的值, 来改变主函数中变量x1、x2、x3的值。,例8.6 求任意三个整数的最大值和最小值。 #include max_min(int a,int b,int c,int *max,int *min) *max=最大值; *min=最小值; void main() int x,y,z,m1,m2,*p1,*p2 scanf(“%d%d%d“, ,第8章 指针,能够熟练使用指针来处理数组,可以使c程序更加 简练、有效,使用指针处理数组,要掌握以下两个要 点,方能操纵自如: 1指针加1的概念和使用 2一个数组的各个元素在内存中是顺序存放的,8.3 指针与数组,第8章 指针,指向数组元素的指针变量,8.3.1 数组的指针,例 int x6; int *p; p=,数组名是表示数组首地址的地址常量,第8章 指针,8.3.2 利用指针变量访问一维数组,例 注意指针的当前值,main() int i,*p,a7; p=a; for(i=0;i7;i+) scanf(“%d“,p+); printf(“n“); for(i=0;i7;i+,p+) printf(“%d“,*p); ,指针变量可以指到数组后的内存单元,p=a;,第8章 指针,8.3.2 利用指针变量访问一维数组,通过指针变量或指针表达式对一个数组的访问,归纳起来有以下几种方法:,1、使用指针变量:int x10,*p; p=x;然后“p+”或“p+=i;”改变指针变量的值 ,再结合for循环语句,即可访问数组x的各个元素。,2、使用指针表达式 如果指针变量指向了数组x,即p=x; 则表达式“p+i”和“x+i”均为数组元素xi的首地 址,因此,改变整型变量i的值,即可访问数组x 的不同元素。,特别强调,数组名x是一个常量,因此,类似于 “x+;”或“x+=i;”是非法的。,第8章 指针,1、将二维数组当作一维数组来处理,8.3.3 利用指针变量访问二维数组,int x43=1,3,5,7,8,11,13,15,17,18,21,23; int *p; p=,第8章 指针,2、将一个二维数组作为一个数组元素均为一维数组 的一维数组。,8.3.3 利用指针变量访问二维数组,如果我们有以下定义:int x43; 则:x00 x01 x02 x10 x11 x12 x20 x21 x22 x30 x31 x32,可以看成:int x4; x0: x00 x01 x02 x1: x10 x11 x12 x2: x20 x21 x22 x3: x30 x31 x32,即: x=x0=&x00 x1=&x10 x2=&x20 x3=&x30,第8章 指针,综上所述,设已经定义一个二维数组x,对该二维数组的 访问,除了可以使用通常的下标法(即使用xij的形式访 问二维数组)外,我们可以采用以下方法:,8.3.3 利用指针变量访问二维数组,1、将二维数组看成一个一维数组,先将指针变量p指向数组x的首地址(即p=)然后利用p+顺序访问。,2、数组名x代表整个数组的首地址,而对于应该二维数组来 讲,xi表示第i行的首地址,因此,表达式“xi+j”也是一个地址,它是数组元素xij在内存中的首地址。另外请注意,xi也可以写成*(x+i)。这样,表达式“xi+j”,也可以写成“*(x+i)+j”两者完全等价。,第8章 指针,3、利用数组每行的首地址,结合指针变量来访问数组。即,当执 行了“p=xi;”后,指针变量p即指向了数组x第i行的第一个 元素xi0,因此,执行了“p+;”后,即可指向xi1; 这样结合for循环,就可以顺序访问其后的数组元素。,8.3.3 利用指针变量访问二维数组,另外值得一提的是,数组x的行地址还有其他一些表 示法 ,其中,“x+i”、“*(x+i)”、“xi”和“&xi”均表 示i行数组元素xi0的首地址,即: &xi0=xi=&xi=x+i=*(x+i) 请注意,以上表示法完全一样。,第8章 指针,8.4 指针与字符串,8.4.1 字符串的一般概念,1.字符串的定义:,例如: #include void main() char x10; gets(x); puts(x); ,字符串数组的初始化: (1)char string=”computer”; (2)char string8=”computer”; (3)char string=c,o,m,p,u,t,e,r; (4)char string8=c,o,m,p,u,t,e,r; (5) char string= ”computer”; (6) char string8= ”computer”;,第8章 指针,8.4.1 字符串的一般概念,2.字符串在数组中的存放与字符串的结束标志,字符串结束标志:0,char x=“book” ;,x0 x1 x2 x3 x4,第8章 指针,3.字符串的访问,8.4.1 字符串的一般概念,1)使用下标访问字符串:,字符串存放在一个数组中,可以使用下标来访问该 一维数组中的各个元素。,2)使用指针表达式访问字符串:,字符型数组同其他类型的一维数组一样,在内 存中各个元素也是连续存放的,数组名也为整个 数组的在内存中的首地址,即整个字符串的首地 址,这样指针表达式“x+0”则表示数组中的第一个 元素在内存中的首地址,表达式“x+1”表示数组第 二个元素在内存中的首地址,表达式“x+i”将表示 数组的第i+1元素在内存中的首地址,也即为字符 串中的第i+1个字符。因此,可以使用指针表达式 来访问一个字符串。,第8章 指针,3)使用指针变量访问字符串:,8.4.1 字符串的一般概念,一个字符串在内存中总有一个首地址,我们可以先定义一个字符型数组,然后定义一个字符型指针变量,利用该指针变量来访问字符。,直接定义一个指针变量来指向某个字符串,说明:c语言是将字符串常量按字符型 数组来处理的,如果执行了以上定义, c语言编译系统将在内存中开辟一个字 符型数组以来存放字符串常量,该数组 的长度为字符串的实际长度加1。,例如:以下用法是合法的: char *p; p=”this is a computer”;,也可以简化为: char *p=”this is a computer”;,char *p; *p=”this is a computer”; 是不合法的,例8.13 将“欢迎使用”四个汉字,按不同的访问方式输出。 void main() char *p=“欢迎使用“; int i; puts(p); /*使用puts函数输出*/ printf(“%s“,p); /*使用printf函数输出*/ printf(“n“); for (i=0;*(p+i)!=0;i+) printf(“%c“,*(p+i); /*使用指针表达式顺序输出输出*/ printf(“n“); for (;*p!=0;p+) printf(“%c“,*p); /*使用指针变量顺序输出输出*/ ,第8章 指针,8.4.2 字符串指针作为函数参数,例 用函数调用实现字符串复制,(1)用字符数组作参数,(2)用字符指针变量作参数,void copy_string(char from,char to) int i=0; while(fromi!=0) toi=fromi; i+; toi=0; main() char a=“i am a teacher.“; char b=“you are a student.“; printf(“string_a=%sn string_b=%sn“,a,b); copy_string(a,b); printf(“nstring_a=%snstring_b=%sn“,a,b); ,void copy_string(char *from,char *to) for(;*from!=0;from+,to+) *to=*from; *to=0; main() char *a=“i am a teacher.“; char *b=“you are a student.“; printf(“string_a=%snstring_b=%sn“,a,b); copy_string(a,b); printf(“nstring_a=%snstring_b=%sn“,a,b); ,第8章 指针,8.4.3 有关字符串的基本操作,1.字符串的合并,2.字符串的复制,所谓字符串的复制就是将一个字符串原样依次 赋给另一个字符型数组。,3.取子串,将一个字符串中的连续几个字符赋给另一个字符 型数组。第一个字符串叫做主字符串,被取出的部 分字符串叫做子字符串。,第8章 指针,8.4.3 有关字符串的基本操作,4.汉字字符串处理技术,注意:一个汉字占两个字节,在显示或取字符串 时,一次要取两个字节。,#include void main() char *p=“山东理工大学“; int i; for (i=1;*p!=0;i+,p+=2) printf(“n%c%c“,*p,*(p+1); ,运行结果为: 山 东 理 工 大 学,第8章 指针,8.5 指针与函数,8.5.1 指针类型的函数(返回值为指针的函数),指针类型函数的定义,定义指针类型函数的一般格式为: 【格式】 函数类型 *函数名(形参列表) 函数的声明部分 语句 ,例如: int *max( int x,int y ) ,第8章 指针,8.5 指针与函数,指针类型函数的引用,8.5.1 指针类型的函数(返回值为指针的函数),指针类型函数的返回值为一个指针,不是普通的 数据,而是一个内存地址。,例8.20 找出一维数组中的最大值和最小值。 #include int max(int *p,int n) int m_max; m_max=*p; for (;n0;n-,p+) if (*pm_max) m_max=*p; return (m_max); int *min(int *p,int n) int *m_min; for (;n0;n-,p+) if (*p*m_min) m_min=p; return (m_min); void main() int a10=8,5,8,10,1,7,34,-100,21,6,*p_min,p_max; p_max=max(a,10); p_min=min(a,10); printf(“n最大值为%d 最小值为%d“,p_max,*p_min);,第8章 指针,8.5.1 指针类型的函数(返回值为指针的函数),普通函数和指针类型的函数的区别:,1)在定义上,如果函数名前加上一个“*”号,该函数 即被定义为指针类型,如果函数名前不加“*”号,即可以 定义为普通类型的函数。,2)在函数的返回值上,所有函数的返回值,均是由 return语句返回的,但是,由于指针类型函数的返回 值必须为一个指针,即return 语句后,必须是一个指 针表达式。,3)在主程序中,调用函数后,一个返回普通数据,一 个返回指针。,第8章 指针,8.5.2 函数的指针以及指向函数的指针变量,指向函数的指针变量的定义,指向函数的指针变量定义的一般形式为: 【格式】 数据类型 (*指针变量名)();,例如: int (*p_funtion)();,函数返回值的数据类型,专门存放函数入口地址 可指向返回值类型相同的不同函数,( )不能省 int (*p)() 与 int *p()不同,函数指针变量赋值:如p=max;,函数指针变量指向的函数必须有函数说明,第8章 指针,8.5.2 函数的指针以及指向函数的指针变量,利用指向函数指针的指针变量来调用函数,1)先将某个函数的入口地址赋给已经定义了的指向 函数的指针变量,其一般形式为: 指向函数的指针变量名=函数名;,)使用指向函数的指针变量来调用某个函数。 当某个指向函数的指针变量指向了某个函数后,要 调用该函数,可以采用以下形式: (*指向函数的指针变量名)(函数的实参表) 即用“(*指向函数的指针变量名)”来取代原来函数 名的位置即可。,第8章 指针,8.5.2 函数的指针以及指向函数的指针变量,指向函数的指针作为函数的参数,例 用函数指针变量作参数,求最大值、最小值和两数之和,第8章 指针,8.6 指向指针的指针和指针数组,指针数组,1指针数组的定义: 指针数组定义的一般形式为: 【格式】 类型名 *数组名数组长度;,如:int *x10;,2指针数组的引用 指针数组的引用同其他指针变量一样,我们 使用运算符“*”,可以取其内容,用运算符“&”, 可以取另一个变量的首地址。,第8章 指针,8.6 指向指针的指针和指针数组,指向指针的指针变量,1指向指针的指针变量的定义: 指向指针的指针变量定义的一般形式为: 类型名 *指针变量名;,一个指针变量存放的是另一个指针变量在内存中 的首地址,则称指针变量p为指向指针的指针变量。,例如:int *x; int *(*x);,第8章 指针,8.6 指向指针的指针和指针数组,指向指针的指针变量,2指向指针的指针变量的引用: 指向指针的指针变量,同其他指针变量没有任 何区别,不过要注意,“*x”不是一个运算的数据, 它还是一个地址,而“*x”才能取出其最终的内容。,#include / 1 void main() / 2 / 3 int x; / 4 int *p; / 5 int *pp; / 6 x=10; / 7 p= / 12 / 13,运行结果为: x=10 *pp=&p=6684148 *pp=*p=x=10,第8章 指针,8.6 指向指针的指针和指针数组,指针数组作为主函数main的形参,带参数的main函数形式:,main(int argc, char *argv) ,命令行中参数个数,元素指向命令行参数 中各字符串首地址,形参名任意,命令行参数 命令行:在操作系统状态下,为执行某个程序而键入的一行字符 命令行一般形式:命令名 参数1 参数2参数n,c:tc test name1 name2 name3,第8章 指针,8.6 指向指针的指针和指针数组,指针数组作为主函数main的形参,命令行参数传递,第一个参数: main所在的可执行文件名,第8章 指针,小 结,一、基本概念,1单元的地址,2单元的内容,二、与指针有关的类型定义:,int *p;定义一个指向普通变量的指针变量 int *pn;定义一个指针数组 int (*p)n;定义一个指向一维数组的指针本来 int *p();定义一个指针函数,该函数的返回值为指针。 int (*p)();定义一个指向函数的指针变量 int *p;定义一个指向指针的指针变量。,第8章 指针,小 结,三、指针变量的赋值,2. 将指针指向某个普通变量、数组、函数等,四、有关指针的运算和指针表达式,1使用c语言中的标准函数中的运算符,3可以为指针赋空值,或将一个已经同类型的指针 变量的值赋给另一个指针变量,1指针运算,2指针表达式,第8章 指针,本章习题均要求利用指针来完成。 8.1 键盘输入n个考试成绩(n=40),请将所有低于平均分的成绩输出。 8.2 键盘输入三个整数,请按照从小到大的顺序输出。 8.3 键盘输入三个任意整数a、b、c,请按照从小到大的顺序输出。要求键盘输入三个整数到变量a、b、c后,程序中不能再改变这些变量的原有值。 8.4 键盘输入四个整数,求其最大值、最小值和平均值,要求这数据的输入和结果的输出在主函数main中进行,求最大值、最小值和平均值用一个自定义函数完成。 8.5 将任意一个n阶方阵转置,并判断是否为对称阵。,课后作业,第8章 指针,8.6 编写两个函数,将以下两个33方阵,分别赋给两个二维数组。 1) 1 2 3 2) 0 1 2 4 5 6 1 0 1 7 8 8 2 1 0 要求由循环自动产生这些有规律的数据。 8.7 设计一个程序,将一个字符串原样复制。要求字符串的输入和输出均在主函数main中进行,字符串的复制在自定义的函数中进行。 8.8 输入任意一个字符串,请将其中的英文大小写相互转换,即将原来的所有英文大写字母都变为英文小写字母,将原来的所有英文小写字母转都换为英文大写字母,其他字符不变。,课后作业,第8章 指针,8.8 汉字字符串加密,即输入一个汉字字符串,然后将每个汉字的第一个字节与该汉字的第二个字节交换(一个汉字占两个字节,存放到数组后,相当于两个字符),这样输出结果将是一些乱字符或怪汉字,从而达到汉字字符串加密的目的。汉字字符串原来的形式称之为原文,经过加密处理以后的字符串称之为密文,要求在主程序main中,输入和输出原文和密文,在自定义的函数中进行加密处理。 8. 10 编写一个函数,求任意二个n阶方阵的和。 8.11 在主程序中输入任意一个字符串,然后编写两个函数,一个求该字符串的长度n,另一个将其反序,即将字符串中的第一个字符交换与最后一个字符,第二个字符与倒数第二个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年厨房设备进出口贸易代理协议
- 二零二五年度文化娱乐项目开发合同摘要
- 2025版摩托车售后服务网点加盟协议
- 二零二五年度教育行业贷款购销合同
- 二零二五版智能硬件研发联合出资合作协议
- 2025版便利店连锁加盟品牌推广合作合同
- 二零二五年度房屋买卖合同样本及房地产交易税费减免协议
- 二零二五年度抵押资产购销法律咨询及服务合同
- 2025版股权质押借款跨境投资合作合同
- 2025车库租赁合同范本汇编:车位租赁合同签订指南
- 学院 军训协议书
- 快速康复在泌尿外科的应用
- 食材应急保障方案
- 5.1 平行与垂直(课件)-2025-2026学年四年级上册数学人教版
- 分厂团队管理办法
- 信息通信网络运行管理员测试题及答案
- 2025民族团结测试题及答案
- 农村初中作文教学的困境与突破-基于24所学校的调查研究
- 乙型病毒性肝炎护理查房
- 2025年生物科技研发专家知识技能检测试题及答案
- 妇产科护理巨大儿
评论
0/150
提交评论