《C语言指针讲解》PPT课件.ppt_第1页
《C语言指针讲解》PPT课件.ppt_第2页
《C语言指针讲解》PPT课件.ppt_第3页
《C语言指针讲解》PPT课件.ppt_第4页
《C语言指针讲解》PPT课件.ppt_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

第8章 指针,8.1 地址和指针的概念,例:int i, j; i= 3; 2000 j= 4; 2001 3300 3301 printf(“%d”,i); 根据变量名与地址对应关系,找到变量i的地址,然后从2000开始的两个字节中取出数据(3)输出; scanf(“%d”, 把从键盘输入的值送到地址为2000开始的整型存储单元中;,3 . . . . 4,8.1 地址和指针的概念,通过变量名取值或存值的方式叫直接存取方式; 间接存取方式:先把变量(i)的地址存入另一个变量,然后通过这个存放地址的新变量来存取变量(i)的值; 在C语言中: 指针:就是内存地址; 指针变量:就是存放内存地址的变量;,8.2 指针和指针变量,变量的指针就是变量的地址,存放变量地址的变量称为指针变量。 1、指针变量的定义: 类型标识符 *指针变量名; 例: int *p, k=5; p=,&k,5,5,8.2 指针和指针变量,2、指针变量的引用 1)指针变量的引用有三种情况 (1)给指针变量赋值。 如:p = 则 *p 就代表变量a,8.2 指针和指针变量,例: main ( ) int x, y; int *p, *q; x= 4; y= 5; p= (解释程序执行过程),8.2 指针和指针变量,2) 则 * & a & * a * & p & * p 分别表示什么意思?,8.2 指针和指针变量,例:输入a 和b 两个整数,按先大后小的顺序输出a 和 b。(借助指针实现) main ( ) int *p1, *p2, *p, a, b, c; scanf (“%d,%d”, 求两种方式的运行结果,练习:输入3个整数,按由小到大的顺序输出。,8.2 指针与函数,3、指针变量作为函数参数 注意:一般变量作为参数时传值;数组名作为参数时传地址;指针变量名作为参数也传地址。 例:输入a 和b 两个整数,按先大后小的顺序输出a 和 b。 file1: void s(int p, int q) int t; t= p; p= q; q= t; main ( ) int a, b; scanf (“%d,%d”, 则运行结果为: ?,8.2 指针与函数,File2: void s(int *p, int *q) int t; t= *p; *p= *q; *q= t; main ( ) int a, b; scanf (“%d,%d”, 则运行结果为: ?,8.2 指针与函数,File 3: void s(int *p, int *q) int * t; t= p; p= q; q= t; main ( ) int a, b; scanf (“%d,%d”, 则运行结果为: ?,8.3 通过指针引用数组,8.3 数组与指针-数组元素的指针,1、指向数组元素的指针 例: p a0 int a10; *p; a1 p= 等价,8.3 数组与指针-指针的运算,2、指针的运算 a0 例: p= 则 *p 代表 a4 p+1 指向 a5 *(p+1) 代表 a5 p+2 指向 a6 *(p+2) 代表 a6 p-1 指向 a3 *(p-1) 代表 a3 p-2 指向 a2 *(p-2) 代表 a2,8.3 数组与指针-指针的运算,可见:指向数组的指针变量可以与整数进行算术运算: 指针变量 +(-) n 表示当前指针变量指向元素后(前)的第n个数组元素; +(-) 指针变量 表示指针变量指向下一个(上一个)数组元素,再引用; 指针变量 +(-) 表示先引用然后指针变量指向下一个(上一个)数组元素; 因此: 如果有:int a10, *p; p=a; 则: 1)p+1指向同一数组中的下一个元素;p-1指向同一数组中的上一个元素;,8.3 数组与指针-指针的运算,2)如p= 则 p-q 为2 5)a 代表数组首地址,也可参加运算 例:a+2 代表a2的地址 a+ 错,8.3 数组与指针-通过指针引用数组元素,3、通过指针引用数组元素 为变址运算符,ai即按a+i计算地址然后找出该地址单元中的值; 这样,当指针变量p指向数组首地址后,对下标为i的数组元素引用有四种方式: (如p=a) *(p+i) *(a+i) ai pi,8.3 数组与指针-通过指针引用数组元素,例:假设数组a有十个元素,输出这十个元 素的值; file1: main () int i, a10=9,8,7,6,5,4,3,2,1,0, *p; for ( i=0; i10; i+) printf (“%d,”, *(p+i) ); 或 *(a+i) 或 ai 或 pi file2: main () int i, *p, a10=9,8,7,6,5,4,3,2,1,0; p= a; for ( i=0; i10; i+) 或 for(; pa+10; ) printf (“%d,”, *p); p+; ,练习,1、将一个数组中的值按逆序重新存放。例如:原来顺序为8,6,5,4,1。要求改为1,4,5,6,8 2、已有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。 3、P247-5,8.3 数组与指针-用数组名作函数参数,4、用数组名作函数参数 1) 当用数组名作为函数参数时,由于数组名代表的是数组首元素地址,因此传递的值是地址; 例:void pp(int a , int n) int j; for ( j=0; jn; j+) if ( aj0 ) aj =0; main() int k, x6 = 1,-2, 3, -4, 5, -6; pp(x, 6); for ( k=0; k6; k+) printf(“%d “, xk); ,8.3 数组与指针-用数组名作函数参数,pp函数中形参a接收从实参传递过来的数组首元素的地址;因此,形参数组名可以用指针变量来处理; void pp(int *a, int n) int j; for ( j=0; jn; j+) if ( *(a+j)0 ) *(a+j) =0; ,8.3 数组与指针-用数组名作函数参数,2)实参数组名代表一个固定地址(指针型常量),而形参数组并不是一个固定的地址值(而作为指针变量),在函数调用开始时,它的值等于实参数组起始地址,在函数执行期间,它可以再被赋值;如: void pp(int a , int n) int j; for ( j=0; jn; j+,a+) if ( *a0 ) *a =0; ,8.3 数组与指针-用数组名作函数参数,3)如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下4中情况: (1)形参和实参都是数组名;如: main() pp (int a , int n) int x6; pp (x, 6); (2)实参用数组名,形参用指针变量;如: main() pp (int *a, int n) int x6; pp (x, 6); ,8.3 数组与指针-用数组名作函数参数,(3)实参形参都用指针变量。如: main() pp (int *a, int n) int x6, *p; p=x; pp (p, 6); (4)实参是指针变量,形参为数组名;如: main() pp (int a , int n) int x6, *p p=x; f (p, 6); ,8.3 数组与指针-通过指针引用多维数组,5、多维数组与指针 (1)指针变量指向二维数组的某个元素(a i j ) 设有 int a23, *p; 则 p = 二维数组元素的引用 * 指针变量 (如 * p ),8.3 数组与指针-通过指针引用多维数组,例:输出二维数组 main () int i, j, a23=1,2,3,4,5,6, *p; for ( i=0; i2; i+) printf ( “n” ); for ( j=0; j3; j+) p= ,8.3 数组与指针-通过指针引用多维数组,对指向二维数组首地址的指针变量按一维数组方式处理; 例:输出二维数组 main () int i, j, a23=1,2,3,4,5,6, *p; p = a; for ( i=0; i2; i+) printf ( “n” ); for ( j=0; j3; j+) printf (“%d “, * p); p +; ,8.3 数组与指针-通过指针引用多维数组,(2)指针变量指向二维数组首地址 在二维数组中,某个数组元素(a i j)相对于数组第一个数组元素(a00)的相对位置的计算公式为: i * m + j 其中, m是该数组的列数 设有 int a23, *p; p = 则 a12 的地址是 p+1*3+2 二维数组元素的引用 * ( 指针变量+ i*列数 +j) 如 a12 表示为 * ( p+1*3+2),8.3 数组与指针-通过指针引用多维数组,例:输出二维数组 main () int i, j, a23=1,2,3,4,5,6, *p; p = a; for ( i=0; i2; i+) printf ( “n” ); for ( j=0; j3; j+) printf (“%d “, *( p+i*3+j ); ,8.3 数组与指针-通过指针引用多维数组,(3)指针变量指向二维数组中某个一维数组 二维数组可以看成若干个一维数组; 例: a 23 可以看作两个一维数组 a0、a1 A)指向二维数组中某一维数组的指针变量的定义和赋值; 格式: 数组类型 ( *指针变量 )m m为对应二维数组列长度 例: int a23; int ( *p )3;,8.3 数组与指针-通过指针引用多维数组,B)引用 如某指针变量指向某二维数组首地址,则该二维数组中第 i 行对应的一维数组的首地址表示为: * (指针变量 + i ) 例: int a23, (*p)3; p = a; 则 a0 首地址 *(p+0) a0 a1 首地址 *(p+1) a1,8.3 数组与指针-通过指针引用多维数组,二维数组元素的引用方法 假定指针变量p指向二维数组a的首地址 则 a i j 的地址表示为 *( p+i )+ j a i j 的引用为 *( *( p+i ) +j ) 例:输出二维数组 main () int i, j, a23=1,2,3,4,5,6, (*p)3; p = a; for ( i=0; i2; i+) printf ( “n” ); for ( j=0; j3; j+) printf (“%d “, * ( *(p+i) +j) ); ,8.3 数组与指针-通过指针引用多维数组,(4)用指向数组的指针作函数参数 (略),8.4 通过指针引用字符串,8.4 通过指针引用字符串,1、字符串的表示形式 (1)用字符数组存放一个字符串,然后输出该字符串; 例: main ( ) char str = “I love china”; printf (“%s”, str ); ,8.4 字符串与指针,(2)用字符指针指向一个字符串 例: main ( ) char str = “I love china”; char *p; p= str; printf (“%s”, p ); 或 main ( ) char *p = “I love china”; printf (“%s”, p ); 注:p变量中存放的是第1个字符的地址; 指向字符串的指针应为char型,8.4 字符串与指针,2、字符串指针作函数参数 与数组名作函数参数类似 (略) 3、对使用字符指针变量和字符数组的讨论 (1)字符数组由若干数组元素构成,每个数组元素存放一个字符; 字符指针变量中存放的是地址(字符串第1个字符的地址);,8.4 字符串与指针,(2)字符指针变量和字符数组赋初值 例: char *p = “I love China”; char p = “I love China”; 相似 (3)赋值方式: 对字符数组 char p14; p = “I love China”; 错误 对字符指针变量 char *p; p = “I love China”, 正确,8.4 字符串与指针,(4) char p10; scanf (“%s”, p); 系统将分配10个存储单元用来存放输入的数据; char * p; scanf (“%s”, p); 系统将给p分配一个存储单元用来存放地址;而输入的字符串存放在什么位置不确定,这会严重后果;因此,应当这样: char *p, str14; p = str; scanf (“%s”, p);,8.4 字符串与指针,(5)字符指针变量的值可以改变 例: main ( ) char *p = “I love China”; p = p+7; printf (“%s”, p); 运行结果为:China main ( ) char p = “I love China”; p = p+7; printf (“%s”, p); 该程序错误 ( 数组名是地址常量,它的值是不能改变的 ),8.4 字符串与指针,(6)字符数组中各元素的值是可以改变(再赋值),但字符指针变量指向的字符串中的内容是不可以被取代的。 例: char a=“blue”; char *p=“blue”; a2 = a ; p2 = a; 不合法,8.4 字符串与指针,例:从键盘上输入一个字符串,统计该字符串长度; main() char c80, *p; int j=0; p = c; scanf (“%s”, p); while ( *p != 0) j+; p+; printf (“length of string = %dn”, j ); ,8.5 指向函数的指针,8.5 指向函数的指针,1、用函数指针变量调用函数 编译时,系统会为函数代码分配一段存储空间,这段存储空间的起始地址称为函数的指针。 指向函数的指针变量定义的一般形式: 数据类型 (*指针变量名) (),8.5 指向函数的指针,例:求两个数中最大数(原方法:通过函数名调用函数) main() int max (int ,int); int a, b, c; scanf (“%d,%d”, ,int max (int x, int y) if ( xy ) return(x); else return(y); ,8.5 指向函数的指针,用一个指针变量指向一个函数,通过指针变量来访问它指向的函数; 将 main 函数改写为: main () int max(int, int); int (*p)(int int); int a, b, c; p= max; scanf (“%d, %d”, ,8.5 指向函数的指针,注意事项: 指向函数的指针变量的一般形式为: 数据类型 ( *指针变量名) (函数参数表列); 如: int (*p) (int, int); 在给函数指针变量赋值时,不应带参数; 例: p= max; 指向函数的指针变量并不固定指向某函数,但所指向的函数类型应与函数指针变量类型保持一致; 在用函数指针变量调用函数时,格式为: (*指针变量名)(实参表),8.2 指针与函数,2、用指向函数的指针作函数参数 例: main() int max(int, int); int pp(int, int, int (*p)(); int x, y, z; scanf (“%d,%d”, ,8.6 返回指针值的函数,8.6 返回指针值的函数,返回指针值的函数的一般定义形式: 数据类型 *函数名 (参数表) 例

温馨提示

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

评论

0/150

提交评论