好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

语言之第10章指针ppt课件.ppt

109页
  • 卖家[上传人]:工****
  • 文档编号:584295383
  • 上传时间:2024-08-30
  • 文档格式:PPT
  • 文档大小:642KB
  • / 109 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第十章第十章 C程序程序设计(第三版)(第三版) 2l l 主要内容￿￿10.1￿￿10.1地址和指地址和指针的概念的概念￿￿10.￿￿10.22变量的指量的指针和指向和指向变量的量的￿ ￿指指针变量量￿￿10.￿￿10.3数3数组与指与指针￿ ￿￿￿10.￿￿10.4字符串与指4字符串与指针￿￿10.￿￿10.5指向函数的指5指向函数的指针￿￿10.￿￿10.6前往指6前往指针值的函数的函数￿￿10.￿￿10.7指7指针数数组和指向指和指向指针的指的指针￿￿10.8￿￿10.8有关指有关指针的数据的数据类型和指型和指针运算的小运算的小结 C程序程序设计(第三版)(第三版) 3 10.1 10.1地址和指针的概念地址和指针的概念内存区的每一个字节有一个编号,这就是“地址〞 假设在程序中定义了一个变量,在对程序进展编译时,系统就会给这个变量分配内存单元 1.按变量地址存取变量值的方式称为“直接访问〞方式 printf〔″%d″,i〕; scanf〔″%d″,&i〕; k=i+j; C程序程序设计(第三版)(第三版) 4 C程序程序设计(第三版)(第三版) 52. 另一种存取变量值的方式称为“间接访问〞的方式。

      即,将变量i的地址存放在另一个变量中在C言在C言语中,指中,指针是一种特殊的是一种特殊的变量,它是量,它是存放地址的存放地址的 C程序程序设计(第三版)(第三版) 6一个变量的地址称为该变量的“指针〞例如,地址2000是变量i的指针假设有一个变量专门用来存放另一变量的地址〔即指针〕,那么它称为“指针变量〞上述的i_pointer就是一个指针变量指指针和指和指针变量的定量的定义:: C程序程序设计(第三版)(第三版) 7 10.2 10.2 变量的指针和指向变量的指变量的指针和指向变量的指 针变量针变量10.10.22.1 .1 定定义一个指一个指针变量量定义指针变量的普通方式为基类型 *指针变量名; C程序程序设计(第三版)(第三版) 8下面都是合法的定义:float *pointer_3; char *pointer_4; 可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量例如:pointer_1=&i;pointer_2=&j; C程序程序设计(第三版)(第三版) 9在定在定义指指针变量量时要留意两点:要留意两点:(1)指针变量前面的“*〞,表示该变量的类型为指针型变量。

      2)例: float *pointer_1;(3)指针变量名是pointer_1 ,而不是* pointer_1 (4)(2) 在定义指针变量时必需指定基类型5)需求特别留意的是,只需整型变量的地址才干放到指向整型变量的指针变量中下面的赋值是错误的∶(6) float a; (7) int * pointer_1; (8) pointer_1=&a; C程序程序设计(第三版)(第三版) 1010.2.2 10.2.2 指针变量的援用指针变量的援用 留意留意:指指针变量中只能存放地址〔指量中只能存放地址〔指针〕,〕,不要将一个整数〔或任何其他非地址不要将一个整数〔或任何其他非地址类型的数据〕型的数据〕赋给一个指一个指针变量 例例10.11 经过指指针变量量访问整型整型变量量#include void main ( ){ int a,b; int*pointer_1, *pointer_2; a=100;b=10; pointer_1=&a; /*把变量a的地址赋给 pointer_1 */ C程序程序设计(第三版)(第三版) 11pointer_2=&b; /*把变量b的地址赋给 pointer_2 */printf〔″%d,%d\n″,a,b〕;printf〔″%d,%d\n″,*pointer_1, *pointer_2〕; } C程序程序设计(第三版)(第三版) 12对““&〞和&〞和“*“*〞运算符〞运算符阐明:明:假假设已已执行了行了语句句 pointer_ pointer_1=&a;1=&a;(1)(1)&&* pointer_* pointer_1的含1的含义是什么?是什么? “ “&〞和&〞和“*“*〞两个运算符的〞两个运算符的优先先级别一一样,但按自右而左方向,但按自右而左方向结合。

      因此,&合因此,&* * pointer_pointer_1与&a一1与&a一样,即,即变量量a a的地址 假假设有有pointer_2 pointer_2 =&=&* pointer_* pointer_11 ;它的作用是将&a〔a的地址〕;它的作用是将&a〔a的地址〕赋给pointer_2 pointer_2 ,假,假设pointer_2pointer_2原来指向b,原来指向b,经过重新重新赋值后它已不再指向b了,而指向了a后它已不再指向b了,而指向了a C程序程序设计(第三版)(第三版) 13 C程序程序设计(第三版)(第三版) 14(2) *&a的含&a的含义是什么?是什么? 先先进展&a运算,得a的地址,再展&a运算,得a的地址,再进展展*运算&&a和a和*pointer_1的作用是一1的作用是一样的,它的,它们都等价于都等价于变量量a即*&a与a等价&a与a等价3) 〔〔*pointer_1〕++相当于a++1〕++相当于a++ C程序程序设计(第三版)(第三版) 15例例10 . 2 输入a和b两个整数,按先大后小的入a和b两个整数,按先大后小的顺序序输出出 a和b。

      a和binclude void main〔〕{ int *p1,*p2,*p,a,b;  scanf〔″%d,%d″,&a,&b〕; p1=&a;p2=&b;  if〔a<b〕 {p=p1;p1=p2;p2=p;} printf〔″a=%d,b=%d\n\n″,a,b〕; printf〔″max=%d,min=%d\n″,*p1,*p2〕;} C程序程序设计(第三版)(第三版) 16运运转情况如下:情况如下:5,95,9↙ ↙a=5,b=9a=5,b=9max=9,min=5max=9,min=5当当输入a=5,b=9入a=5,b=9时,由于a<b,,由于a<b,将p1和p2交将p1和p2交换交换前的情况前的情况见图〔〔a〕,交a〕,交换后后见图〔b〕 C程序程序设计(第三版)(第三版) 17 C程序程序设计(第三版)(第三版) 1810.10.22.3 .3 指指针变量作量作为函数参数函数参数例例10 . 3 对输入的两个整数按大小入的两个整数按大小顺序序输出出 #include void main〔〕{void swap〔int *p1,int *p2〕; int a,b; int *pointer_1,*pointer_2; scanf〔″%d,%d″,&a,&b〕; pointer_1 =&a; pointer_2 =&b;  if〔a<b= swap〔 pointer_1 , pointer_2 〕; printf〔″\n%d,%d\n″,a,b〕;  } C程序程序设计(第三版)(第三版) 19void swap〔int *p1,int *p2〕{ int temp; temp=*p1; *p1=*p2; *p2=temp; } C程序程序设计(第三版)(第三版) 20 C程序程序设计(第三版)(第三版) 21例例10.44 输入a、b、c入a、b、c 3个整数,按大小个整数,按大小顺序序输出。

      出include void main〔〕{ void exchange〔int *q1, int *q2, int *q3〕;  int a,b,c,*p1,*p2,*p3;  scanf〔″%d,%d,%d″,&a, &b, &c〕; p1=&a;p2=&b;p3=&c;  exchange 〔p1,p2,p3〕;  printf〔″\n%d,%d,%d\n″,a,b,c〕; } C程序程序设计(第三版)(第三版) 22void exchange〔int *q1, int *q2, int *q3〕{ void swap〔int *pt1, int *pt2〕; if〔*q1<*q2〕 swap〔q1,q2〕;   if〔*q1<*q3〕 swap〔q1,q3〕;   if〔*q2<*q3= swap〔q2,q3〕; } void swap〔int *pt1, int *pt2〕 {int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; } C程序程序设计(第三版)(第三版) 23 10.3 10.3 数组与指针数组与指针 一个变量有地址,一个数组包含假设干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。

      指针变量既然可以指向变量,当然也可以指向数组元素〔把某一元素的地址放到一个指针变量中〕所谓数组元素的指针就是数组元素的地址 C程序程序设计(第三版)(第三版) 24定义一个指向数组元素的指针变量的方法,与以前引见的指向变量的指针变量一样例如:int a[10]; (定义a为包含10个整型数据的数组)int*p; (定义p为指向整型变量的指针变量)该当留意,假设数组为int型,那么指针变量的基类型亦应为int型 10.3.1 10.3.1 指向数组元素的指针指向数组元素的指针 C程序程序设计(第三版)(第三版) 25对该指针变量赋值:对该指针变量赋值:p=&a[0];p=&a[0];把a[0]元素的地址赋给指针变量p也就是使p把a[0]元素的地址赋给指针变量p也就是使p指向a数组的第0号元素,如图:指向a数组的第0号元素,如图: C程序程序设计(第三版)(第三版) 2610.10.33. .2经过指针援用数组元素2经过指针援用数组元素援用一个数组元素,可以用:  〔1〕 下标法,如a[i]方式;  〔2〕 指针法,如*〔a+i〕或*〔p+i〕。

      其中a是数组名,p是指向数组元素的指针变量,其初值p=a例例10.5 输出数出数组中的全部元素中的全部元素 假设有一个a数组,整型,有10个元素要输出各元素的值有三种方法: C程序程序设计(第三版)(第三版) 27(1)下下标法include void main〔〕〔〕{{ int a[10];a[10];   int i; i;  for〔i=0;i<10;i++〕〔i=0;i<10;i++〕    scanf〔〔″%d%d″,&a[i]〕;,&a[i]〕;   printf〔〔″\n\n″〕;〕;  for〔i=0;i<10;i++〕〔i=0;i<10;i++〕    printf〔〔″%d%d″,a[i]〕;,a[i]〕; }} C程序程序设计(第三版)(第三版) 28(2) 经过数数组名名计算数算数组元素地址,找出元素的元素地址,找出元素的值include void  main〔〕〔〕{{ int a[10];a[10];   int i;i;  for〔i=0;i<10;i++〔i=0;i<10;i++ 〕〕    scanf〔〔″%d%d″,&a[i]〕;,&a[i]〕;    printf〔〔″\n\n″〕;〕;   for〔i=0;i<10;i++〕〔i=0;i<10;i++〕     printf〔〔″%d%d″,,*〔a+i〕〕;〔a+i〕〕;   }} C程序程序设计(第三版)(第三版) 29(3) 用指用指针变量指向数量指向数组元素。

      元素include void main〔〕〔〕{{ int a[10];a[10];   int *p,i;p,i;   for〔i=0;i<10;i++〕〔i=0;i<10;i++〕      scanf〔〔″%d%d″,&a[i]〕;,&a[i]〕;   printf〔〔″\n\n″〕;〕;   for〔p=a;p<〔a+10〕;p++〕〔p=a;p<〔a+10〕;p++〕     printf〔〔″%d%d ″,,*p〕;p〕; }} C程序程序设计(第三版)(第三版) 30例例10.66 经过指指针变量量输出a数出a数组的10个元素的10个元素 #include void main〔〕{ int*p,i,a[10]; p=a; for〔i=0;i<10;i++ 〕 scanf〔″%d″,p++〕; printf〔″\n″〕; for〔i=0;i<10;i++,p++ 〕  printf〔″%d″,*p〕;}程序运程序运转情况:情况:1 2 3 4 5 6 7 8 9 0↙ ↙22153 234 0 0 30036 25202 11631 8259 8237 28483显然然输出的数出的数值并不是a数并不是a数组中各元素的中各元素的值 C程序程序设计(第三版)(第三版) 31#include void  main〔〕{ int*p,i,a[10]; p=a; for〔i=0;i<10;i++〕 scanf〔″%d″,p++〕; printg〔″\n″〕; p=a;  for〔i=0;i<10;i++,p++ 〕  printf〔″%d″,*p〕;} C程序程序设计(第三版)(第三版) 3210.10.33.3 .3 用数用数组名作函数参数名作函数参数在第在第8章章8.7节中引中引见过可以用数可以用数组名作函数的参数名作函数的参数如:如: void main〔〕〔〕 {if〔f〔int arr[],,int n〕n〕; int array[10];[10]; ┇ ┇ f〔f〔array,10〕;,10〕; ┇ ┇ }} void ff(int arr[ ],[ ],int nn) { ┇ ┇ } C程序程序设计(第三版)(第三版) 33例例10.7.7 将数将数组a中n个整数按相反a中n个整数按相反顺序存放。

      序存放 C程序程序设计(第三版)(第三版) 34#include void main〔〕〔〕{{ void inv〔〔int x[x[ ],],int n〕n〕; int i,a[10]={3,7,9,11,0,i,a[10]={3,7,9,11,0, 6,7,5,4,2};6,7,5,4,2};  printf〔〔″The original array:\n\n″〕;〕;  for〔i=0;i<10;i++〕〔i=0;i<10;i++〕  printf 〔〔″%d,%d,″,a[i]〕;,a[i]〕;  printf〔〔″\n\n″〕;〕;   inv 〔a,10〕;〔a,10〕;   printf〔〔″The array has been in verted::\nn″〕;〕;   for〔i=0;i<10;i++〕〔i=0;i<10;i++〕   printf 〔〔″%d,%d,″,a[i]〕;,a[i]〕;   printf 〔〔″\n\n″〕;〕;}} C程序程序设计(第三版)(第三版) 35void inv〔int x[ ],int n〕 /*形参x是数组名*/ { int temp,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; }   return; }运运转情况如下:情况如下:The original array::3,7,9,11,0,6,7,5,4,23,7,9,11,0,6,7,5,4,2The array has been inverted::2,4,5,7,6,0,11,9,7,32,4,5,7,6,0,11,9,7,3 C程序程序设计(第三版)(第三版) 36 C程序程序设计(第三版)(第三版) 37#include void main〔〕〔〕{{void inv〔〔int *x,x,int n〕n〕; int i,a[10]={3,7,9,11,0,i,a[10]={3,7,9,11,0, 6,7,5,4,2};6,7,5,4,2};   printf〔〔 ″The original array:\n\n″ 〕;〕;     for〔i=0;i<10;i++〕〔i=0;i<10;i++〕   printf 〔〔″%d,%d,″,a[i]〕;,a[i]〕;   printf 〔〔″\n\n″〕;〕;     inv〔a,10〕;〔a,10〕;   printf 〔〔 ″The array has been in verted::\nn″ 〕;〕;     for〔i=0;i<10;i++〕〔i=0;i<10;i++〕  printf 〔〔″%d,%d,″,a[i]〕;,a[i]〕;  printf 〔〔″\n\n″〕;}〕;}对刚刚的程序可以作一些改的程序可以作一些改动。

      将将函数函数inv中的形参x改成指中的形参x改成指针变量 C程序程序设计(第三版)(第三版) 38void inv〔int *x,int n〕 /*形参x为指针变量*/{intp,temp,*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;} return;} C程序程序设计(第三版)(第三版) 39假设有一个实参数组,想在函数中改动此数假设有一个实参数组,想在函数中改动此数组中的元素的值,实参与形参的对应关系有组中的元素的值,实参与形参的对应关系有以下4种情况:以下4种情况: (1) 形参和形参和实参都用数参都用数组名,如:名,如:void main〔〕〔〕 void f〔f〔int xx[ ],],int n〕n〕{{ int a[10];a[10]; { … … f〔a,10〕;f〔a,10〕; } }} C程序程序设计(第三版)(第三版) 40 C程序程序设计(第三版)(第三版) 41(2) 实参用数参用数组名,形参用指名,形参用指针变量。

      如:量如:void main〔〕main〔〕 void f〔f〔int *x,x,int n〕n〕{{int a[10];a[10]; { … … f〔a,10〕;f〔a,10〕; } }}(3)实参形参都用指参形参都用指针变量例如:量例如:void main〔〕〔〕 void f〔f〔int *x,x,int n〕n〕{{int a[10]a[10], *p=a; { ┇ ┇ ┇ ┇ f〔f〔p,10〕;,10〕; } }} C程序程序设计(第三版)(第三版) 42 C程序程序设计(第三版)(第三版) 43(4) 实参参为指指针变量,形参量,形参为数数组名。

      如:名如: void main〔〕〔〕 void f〔f〔int x[ ],,int n〕n〕{int{int a[10]a[10],*p=a;; { ┇ ┇ ┇ ┇ f〔f〔p,10〕;,10〕; } }} C程序程序设计(第三版)(第三版) 44#include void main〔〕〔〕{ void inv〔〔int *x,x,int n〕n〕; int i,arr[10],i,arr[10],*p=arr;p=arr; printf〔〔″The original array:\n ″〕;〕; for〔i=0;i<10;i++,p++〕〔i=0;i<10;i++,p++〕  scanf〔〔″%d%d″,p〕;,p〕;  printf〔〔″\n\n″〕;〕; p=arr;p=arr; inv〔p,10〕;〔p,10〕; /* 实参参为指指针变量量 */ printf〔〔″The array has been inverted :\n:\n″〕;〕; for〔p=arr;p<arr+10;p++〔p=arr;p<arr+10;p++ 〕〕 printf〔〔″%d%d″,,*p〕;p〕; printf〔〔″\n\n″〕;〕;   }} C程序程序设计(第三版)(第三版) 45void inv〔int *x,int n〕{intp,m,temp,*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;} return; } C程序程序设计(第三版)(第三版) 46例例10..9 用用选择法法对10个整数按由大到小10个整数按由大到小顺序排序。

      序排序 #include void main〔〕{ void sort〔int x[ ],int n〕; int*p,i,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++;}} C程序程序设计(第三版)(第三版) 47void sort〔int x[ ],int n〕{ int i,j,k,t; for〔i=0;i<n-1;i++〕 {k=i;  for〔j=i+1;j<n;j++〕  if〔x[j]>x[k]〕  k=j;  if〔k!=i〕  {t=x[i]; x[i]=x[k]; x[k]=t;}  } } C程序程序设计(第三版)(第三版) 4810.3.4 10.3.4 多多维数数组与指与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。

      但在概念上和运用上,多维数组的指针比一维数组的指针要复杂一些 1. 1. 多多维数数组元素的地址元素的地址先回想一下多维数组的性质,可以以为二维数组是“数组的数组〞,例 :定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};那么二维数组a是由3个一维数组所组成的设二维数组的首行的首地址为2000 ,那么 C程序程序设计(第三版)(第三版) 49表表 示示 形形 式式含义含义地地 址址a 二维数组名,指向一维数组a[0],即0行首地址2000a[0],*(a+0),*a0行0列元素地址2000a+1,&a[1]1行首地址2019a[1],*(a+1) 1行0列元素a[1][0]的地址2019A[1]+2,*(a+1)+2,&a[1][2]1行2列元素a[1][2] 的地址2019*(a[1]+2),*(*(a+1)+2),a[1][2]1行2列元素a[1][2]的值元素值为13 C程序程序设计(第三版)(第三版) 50例例10.110 输出二出二维数数组有关的有关的值 #include #define FROMAT ″%d,%d\n″void main〔〕{ int a[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,&a[0],&a[0][0]〕; printf〔FORMAT,a[1],a+1〕; printf〔FORMAT,&a[1][0],*〔a+1〕+0〕; printf〔FORMAT,a[2],*〔a+2〕〕; printf〔FORMAT,&a[2],a+2〕;  printf〔FORMAT,a[1][0],*〔*〔a+ 1〕+0〕〕; } C程序程序设计(第三版)(第三版) 51某一次运某一次运转结果如下:果如下:158,158158,158 (0行首地址和行首地址和0行行0列元素地址列元素地址)158,158158,158 (0行行0列元素地址列元素地址)158,158158,158 (0行行0首地址和首地址和0行行0列元素地址列元素地址)166,166166,166 (1行行0列元素地址和列元素地址和1行首地址行首地址)166,166166,166 (1行行0列元素地址列元素地址)174,174174,174 (2行行0列元素地址列元素地址)174,174174,174 (2行首地址行首地址)9,99,9 (1行行0列元素的列元素的值) C程序程序设计(第三版)(第三版) 522 . 2 . 指向多指向多维数数组元素的指元素的指针变量量(1) 指向数指向数组元素的指元素的指针变量量例例10.11 10.11 用指用指针变量量输出二出二维数数组元素的元素的值 #include void main〔〕{ int a[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〕; } }  运运转结果如下:果如下:1 3 5 7 9 11 13 1519 21 23 C程序程序设计(第三版)(第三版) 53 (2) 指向由m个元素组成的一维数组的指针变量例例10.13 10.13 出二维数组任一行任一列元素的值出二维数组任一行任一列元素的值#include void main ( ){ int a[3][4]={1,3,5,7,9,11, 13,15,17,19,21,23}; int 〔*p〕[4],i,j; p=a; scanf〔″ i=%d,j=%d″,&i,&j〕; printf〔″a[%d,%d]=%d\n″,i, j,*〔*〔p+i〕+j〕〕;} 运转情况如下:i=1,j=2↙〔本行为键盘输入〕a[1,2]=13 C程序程序设计(第三版)(第三版) 543. 用指向数用指向数组的指的指针作函数参数作函数参数例10.13 有一个班,3个学生,各学4门课,计算总平均分数以及第n个学生的成果。

      这个标题是很简单的只是为了阐明用指向数组的指针作函数参数而举的例子用函数average求总平均成果,用函数search找出并输出第i个学生的成果 C程序程序设计(第三版)(第三版) 55#include void main〔〕{ void average〔float *p,int n〕; void search〔float (*p〕[4],int n); float score[3][4]={{65,67,70,60},{80, 87,90,81},{90,99,100,98}}; average〔*score,12〕;/*求12个分数的平均分*/search〔score,2〕;/*求序号为2的学生的成果*/} C程序程序设计(第三版)(第三版) 56void average〔float *p,int n〕{ float*p_end; float 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〕;} C程序程序设计(第三版)(第三版) 57void search〔float (*p)[4],int n〕 / * p是指向具有4个元素的一维数组的指针 */{int i; printf〔″the score of No. %d are:\n″,n〕; for〔i=0;i<4;i++) printf〔″%5.2f″,*〔*〔p+n〕+i〕〕; }程序运程序运转结果如下:果如下:average=82.25=82.25The score of No.2 are::9090.00 9900 99.00 10000 100.00 9800 98.0000 C程序程序设计(第三版)(第三版) 58例例10.114 在上题根底上,查找有一门以上课程不及格的在上题根底上,查找有一门以上课程不及格的学生,打印出他们的全部课程的成果。

      学生,打印出他们的全部课程的成果 #include void main〔〕{void search〔float (*p)[4],int n〕;/*函数声明*/ float score[3][4]={{65,57,70,60},{58,87, 90,81},{90,99,100,98}}; search〔score,3〕;} C程序程序设计(第三版)(第三版) 59void search〔float (*p)[4],int n〕{int i,j,flag; for〔j=0;j<n;j++) {flag=0; for〔i=0;i<4;i++) if〔*〔*〔p+j〕+i〕<60) flag=1; if〔flag==1〕 { printf("No.%d fails,his scores are:\n",j+1);    for〔i=0;i<4;i++〕 printf〔″%5.1f″,*(*(p+j)+i));   printf〔″\n″〕;   } }}  程序运转结果如下:No.1 fails, his scores are:65.0 57.0 70.0 60.0No.2 fails, his scores are:58.0 87.0 90.0 81.0 C程序程序设计(第三版)(第三版) 60 10. 10.44 字符串与指针字符串与指针10.4.10.4.1字符串的表示方式1字符串的表示方式 例例 10.115 定定义一个字符数一个字符数组,,对它初始化,它初始化, 然后然后输出出该字符串字符串 #include void main〔〕{char string[]=″I love China!″; printf〔″%s\n″,string〕; } (1) 用字符数用字符数组存放一个字符串,然后存放一个字符串,然后输出出该字符串。

      字符串 C程序程序设计(第三版)(第三版) 61(2) 用字符指用字符指针指向一个字符串指向一个字符串可以不定可以不定义字符数字符数组,而定,而定义一个字符指一个字符指针用字符指指针指向字符串中的字符指向字符串中的字符 例例10.1.16 定定义字符指字符指针#include void main〔〕〔〕{{charstring==″ I love China!!″;;  printf〔〔″%s\n%s\n″,string〕;,string〕;}} C程序程序设计(第三版)(第三版) 62例例10.10.117 7 将字符串a复制将字符串a复制为字符串b字符串b #include void main〔〕{char a[ ]=″I am a boy.″,b[20]; int i; for〔i=0;*〔a+i〕!=′\0′;i++〕   *〔b+i〕=*〔a+i〕;    *〔b+i〕=′\0′; printf〔″string a is :%s\n″,a〕; printf〔″string b is:″〕; for〔i=0;b[i]!=′\0′;i++〕  printf〔″%c″,b[i]〕; printf〔″\n″〕; } C程序程序设计(第三版)(第三版) 63 也可以设指针变量,用它的值的改动来指向字符串中的不同的字符。

      例例10.118 用指用指针变量来量来处置例置例10.1.17问题include void main〔〕 {char a[ ] =″I am a boy. ″,b[20],*p1,*p2; int i;  p1=a;p2=b; for〔;*p1!=′\0′;p1++,p2++〕 C程序程序设计(第三版)(第三版) 64*p2=*p1;*p2=′\0′;printf〔″string a is:%s\n″,a〕; printf〔″string b is:″〕;for〔i=0;b[i]!=′\0′;i++〕 printf〔″%c″,b[i]〕; printf〔″\n″〕;}程序必需保证使p1和p2同步挪动程序必需保证使p1和p2同步挪动 C程序程序设计(第三版)(第三版) 65 C程序程序设计(第三版)(第三版) 6610.4.2 10.4.2 字符指针作函数参数字符指针作函数参数例例10.19 用函数用函数调用用实现字符串的复制字符串的复制 #include void main〔〕{ void copy_string〔char from[ ], char to[ ]〕; char a[ ]=″I am a teacher.″; char b[ ]=″you are a student.″; printf(“string a=%s\n string b=%s\n″, a,b); printf(“copy string a to string b:\n 〞); copy_string 〔a,b〕; printf("\nstring a=%s\nstring b=%s\n",a,b);   }(1) 用字符数用字符数组作参数作参数 C程序程序设计(第三版)(第三版) 67void copy_string〔char from[ ], char to[ ]〕{ int i=0; while〔from[i]!=′\0′〕 {to[i]=from[i];i++;}   to[i]=′\0′; } 程序运程序运转结果如下:果如下: string a==I am a teacher.. string b ==you are a student.. copy string a to string b:string a ==I am a teacher..stringb=b=I am a teacher.. C程序程序设计(第三版)(第三版) 68(2) 形参用字符指形参用字符指针变量量 #include void main〔〕{ void copy_string〔char * from, char *to〕; char *a=″I am a teacher .″; char *b=″you are a student .″;   printf("string a=%s\nstring b=%s\n″,a,b); printf("copy string a to string b:\n ");   copy_string〔a,b〕; printf("\nstring a=%s\nstring b=%s\n",a,b);    } C程序程序设计(第三版)(第三版) 69void copy_string〔char *from,char *to〕 { for〔;*from!=′\0′;from++,to++〕  *to=from;  *to=′\0′; }(3) (3) 对copy string copy string 函数函数还可作可作简化化 1、将、将copy_string函数改写函数改写为void copy_string 〔〔char *from,,char *to〕to〕 {{while〔〔〔〔*to=to=*from〕!=〕!=′\0\0′〕〕 {{to++;++;from++;}++;} }} C程序程序设计(第三版)(第三版) 70• copy_string函数的函数体函数的函数体还可改可改为{{ while〔〔〔〔*to++=++=*from++〕!=++〕!=′\0\0′〕;〕; }}•copy_string函数的函数体函数的函数体还可写成可写成{ while〔〔*from!=!=′\0\0′〕〕    *to++=++=*from++;++;   *to==′\0\0′;; }} C程序程序设计(第三版)(第三版) 71•上面的上面的while语句句还可以可以进一步一步简化化为下面的下面的while语句:句:while〔〔*to++=++=*from++〕;++〕;它与下面它与下面语句等价:句等价:while〔〔〔〔*to++=++=*from++〕!=++〕!=′\0\0′〕;〕;将将*from赋给*to,假,假设赋值后的后的*to值等于等于′\0\0′那么那么循循环终止〔止〔′\0\0′已已赋给*to〕〕 •函数体中函数体中while语句也可以改用句也可以改用for语句:句:for〔;〔〔;〔*to++=++=*from++〕!=0;〕;++〕!=0;〕;或或for〔;〔;*to++=++=*from++;〕;++;〕; C程序程序设计(第三版)(第三版) 72•也可用指也可用指针变量,函数量,函数copy_string可写可写为void copy_string 〔〔char from[[ ],],char to[to[ ]〕]〕{{char*p1,p1,*p2;p2; p1=p1=from;p2=to;;p2=to;  while〔〔〔〔*p2++=++=*p1++〕!=++〕!=′\0\0′〕;〕;}} C程序程序设计(第三版)(第三版) 73(1) 字符数组由假设干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址〔字符串第1个字符的地址〕,决不是将字符串放到字符指针变量中。

      2)赋值方式对字符数组只能对各个元素赋值,不 能用以下方法对字符数组赋值 char str[14]; str=″I love China!″; 而对字符指针变量,可以采用下面方法赋值: char*a; a=″I love China!″; 10.4.3 10.4.3 对运用字符指运用字符指针变量和字符数量和字符数组的的讨论字符数组和字符指针变量二者之间的区别:字符数组和字符指针变量二者之间的区别: C程序程序设计(第三版)(第三版) 74(3)对字符指针变量赋初值: char *a=″I love China!″;等价于 char*a; a=″I love Chian!″; 而对数组的初始化: char str[14]={″I love China!″}; 不能等价于 char str[14]; str[ ]=″I love China!″; C程序程序设计(第三版)(第三版) 75(4) 定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。

      而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址 例如例如: char str: char str[10];[10];    scanf scanf〔〔″″%s%s″″,,strstr〕;〕; C程序程序设计(第三版)(第三版) 76(5) 指针变量的值是可以改动的,例如:例例10.220 改 改动指指针变量的量的值#include void main〔〕{char*a=″I love China!″; a=a+7; printf〔″%s″,a〕; } C程序程序设计(第三版)(第三版) 77#include void main〔〕{char*a=″I love China!″; int i; printf ( “ The sixth character is %c\n",a[5]); for〔i=0;a[i]!=′\0′;i++〕 printf〔″%c″,a[i]〕; } 假设定义了一个指针变量,并使它指向一个字符串,就可以用下标方式援用指针变量所指的字符串中的字符。

      例如: C程序程序设计(第三版)(第三版) 7810.10.55 指向函数的指针指向函数的指针10.5.1 10.5.1 用函数指针变量调用函数用函数指针变量调用函数•用指针变量可以指向一个函数•函数在编译时被分配给一个入口地址这个函数的入口地址就称为函数的指针 C程序程序设计(第三版)(第三版) 79#include void main〔〕{ int max〔int,int〕;  int a,b,c; scanf〔″%d,%d″,&a,&b〕; c=max〔a,b〕; printf〔″a=%d,b=%d,max=%d ″,a,b,c〕; } int max〔int x,int y〕{ int z; if〔x>y〕z=x;  else z=y; return〔z〕; } C程序程序设计(第三版)(第三版) 80将 main 函数改写为#include void main〔〕{ int max〔int,int〕; int 〔*p〕〔〕; int a,b,c; p=max;  scanf〔″%d,%d″,&a,&b〕; c=〔*p〕〔a,b〕;  printf〔″a=%d,b=%d,max=% d″,a,b,c〕; } C程序程序设计(第三版)(第三版) 8110.5.2 10.5.2 用指向函数的指针作函数参数用指向函数的指针作函数参数 函数指针变量常用的用途之一是把指针作为参数传送到其他函数。

      指向函数的指针也可以作为参数,以实现函数地址的传送,这样就可以在被调用的函数中运用实参函数 C程序程序设计(第三版)(第三版) 82 实参函数名 f1    f2     ↓ ↓void sub〔int (*x1)(int),int (*x2)(int,int)〕{ int a,b,i,j; a=〔*x1〕〔i〕; /*调用f1函数*/ b=〔*x2〕〔i,j〕;/*调用f2函数*/ … } C程序程序设计(第三版)(第三版) 83例例10.10.223 3 设一个函数一个函数processprocess,在,在调用它的用它的时候,每次候,每次实现不同的功能不同的功能输入a和b两个数,第一次入a和b两个数,第一次调用用processprocess时找出a和b中大者,第二次找出其中小者,找出a和b中大者,第二次找出其中小者,第三次求a与b之和第三次求a与b之和 #include void main〔〕{ int max〔int,int〕; /* 函数声明 */ int min〔int,int〕; /* 函数声明 */ int add〔int,int〕; /* 函数声明 */ void process (int , int , int(*fun)(); /* 函数声明 */  int a,b;  printf〔″enter a and b:″〕;  scanf〔″%d,%d″,&a,&b〕;  C程序程序设计(第三版)(第三版) 84 printf〔″max=″〕; process〔a,b,max〕; printf〔″min=″〕; process〔a,b,min〕; printf〔″sum=″〕; process〔a,b,add〕;} C程序程序设计(第三版)(第三版) 85int max〔int x,int y〕 /* 函数定义 */{int z; if〔x>y〕z=x; else z=y; return〔z〕;}int min〔int x,int y〕 /* 函数定义 */ { int z; if〔x<y〕z=x; else z=y; return〔z〕;} C程序程序设计(第三版)(第三版) 86int add〔int x,int y〕 /* 函数定义 */ { intz; z=x+y; return〔z〕;}void process(int x,int y,int (*fun)(int,int)) { int result; result=〔*fun〕〔x,y〕; printf〔″%d\n″, result〕;} C程序程序设计(第三版)(第三版) 8710.10.66 前往指针值的函数前往指针值的函数一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。

      其概念与以前类似,只是带回的值的类型是指针类型而已这种带回指针值的函数,普通定义方式为类型名 *函数名〔参数表列〕;例如:int *a〔int x,int y〕; C程序程序设计(第三版)(第三版) 88例例1010.2.24 4 有假设干个学生的成果〔每个学生有4门课有假设干个学生的成果〔每个学生有4门课程〕,要求在用户输入学生序号以后,能输出该学生的程〕,要求在用户输入学生序号以后,能输出该学生的全部成果用指针函数来实现全部成果用指针函数来实现 #include void main〔〕{float *score[ ][4]={{60,70,80,90}, {56,89,67,88},{34,78,90,66}}; float*search〔float (*pointer)[4],int n〕; float*p; int i,m; printf〔″enter the number of student:″〕; scanf〔″%d″,&m〕; printf〔″The scores of No.%d are:\n″,m〕; C程序程序设计(第三版)(第三版) 89 p=search〔score,m〕; for〔i=0;i<4;i++= printf〔″%5.2f\t″,*〔p+i〕〕; }float * search〔float (*pointer)[4],int n〕{ float *pt; pt=*〔pointer+n〕; return〔pt〕; } 运运转情况如下:情况如下:enter the number of student:1:1↙ ↙The scores of No. 11 are::56.00 89.00 67.00 88.00 C程序程序设计(第三版)(第三版) 90例例10.225 对上例中的学生,找出其中有不及格上例中的学生,找出其中有不及格课程的学生及其学生号。

      程的学生及其学生号include void main〔〕{float score[ ][4]={{60,70,80,90},{56, 89,67,88},{34,78,90,66}}; float search〔float (*pointer)[4]〕; float*p; int i,j; C程序程序设计(第三版)(第三版) 91for〔i=0;i<3;i++〕 {p=search〔score +i〕;  if〔p==*〔score+i〕〕  {printf〔″No.%d scores:″,i〕;   for〔j=0;j<4;j++)   printf〔″%5.2f″,*〔p+j〕〕;   printf〔″\n″〕;}   } } C程序程序设计(第三版)(第三版) 9210.7 10.7 指针数组和指向指针的指针指针数组和指向指针的指针10.7.1 10.7.1 指针数组的概念指针数组的概念一个数组,假设其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。

      一维指针数组的定义方式为:类型名数组名[数组长度];例如:int*p[4]; C程序程序设计(第三版)(第三版) 93 C程序程序设计(第三版)(第三版) 94例例10.226 将假将假设干字符串按字母干字符串按字母顺序〔由小到大〕序〔由小到大〕输出include #include void main〔〕{void sort〔char *name[ ],int n〕; void printf〔char *name[ ],int n〕;  char *name[ ]={"Follow me","BASIC","Great Wall″,"FORTRAN","Computer design"};  int n=5; sort〔name,n〕; print〔name,n〕;} C程序程序设计(第三版)(第三版) 95void sort〔char *name[ ],int n〕{char *temp; int i,j,k; for〔i=0;i<n-1;i++= {k=i;  for〔j=i+1;j<n;j++=  if〔strcmp〔name[k],name[j]〕>0〕k=j;  if〔k!=i〕  temp=name[i]; name[i]=name[k]; name[k]=temp;}  } } C程序程序设计(第三版)(第三版) 96void print〔char *name[ ],int n〕{int i;  for〔i=0;i<n;i++〕   printf〔″%s\n″,name[i]〕; }运转结果为:运转结果为:BASICBASICComputer designFORTRANFollow meGreat Wall C程序程序设计(第三版)(第三版) 9710.7.2 10.7.2 指向指针的指针指向指针的指针定义一个指向指针数据的指针变量:定义一个指向指针数据的指针变量:charchar**p;p;p的前面有两个p的前面有两个*号。

      号运算符的结合性是从右到左,运算符的结合性是从右到左,因此因此**p相当于p相当于*〔〔*p〕,显然p〕,显然*p是指针变量的p是指针变量的定义方式假设没有最前面的定义方式假设没有最前面的*,那就是定义了一,那就是定义了一个指向字符数据的指针变量如今它前面又有一个个指向字符数据的指针变量如今它前面又有一个*号,表示指针变量p是指向一个字符指针变量的号,表示指针变量p是指向一个字符指针变量的p就是p所指向的另一个指针变量p就是p所指向的另一个指针变量 C程序程序设计(第三版)(第三版) 98例例10.227 运用指向指运用指向指针的指的指针 #include void main〔〕{char *name[]={"Follow me","BASIC","Great Wall″,"FORTRAN","Computer design"}; char **p; int i; for〔i=0;i<5;i++〕 {p=name+i;   printf〔″%s\n″,*p〕; } } C程序程序设计(第三版)(第三版) 99例例10.28 一个指一个指针数数组的元素指向整型数据的的元素指向整型数据的简单例子。

      例子include void main〔〕{int a[5]={1,3,5,7,9}; int *num[5]={&a[0],&a[1], &a[2],&a[3],&a[4]}; int **p,i; p=num; for〔i=0;i<5;i++= { printf〔″%d ″,**p〕; p++; } } C程序程序设计(第三版)(第三版) 10010.7.3 10.7.3 指针数组作指针数组作mainmain函数的形参函数的形参  指针数组的一个重要运用是作为main函数的形参在以往的程序中,main函数的第一行普通写成以下方式:void main〔〕括弧中是空的  main函数可以有参数,例如:void main〔int argc,char *argv[ ]〕  命令行的普通方式为命令名 参数1 参数2……参数n C程序程序设计(第三版)(第三版) 101例如一个名为file1的文件,它包含以下的main函数:void main〔int argc,char *argv[ ]〕 {while〔argc>1〕 {++argv;  printf〔″%s\n″,argv〕; --argc; } }在DOS命令形状下输入的命令行为file1 China Beijing那么执行以上命令行将会输出以下信息:ChinaBeijing C程序程序设计(第三版)(第三版) 10210.810.8有关指针的数据类型和有关指针的数据类型和指针运算的小结指针运算的小结10.8.110.8.1有关指针的数据类型的小结有关指针的数据类型的小结 C程序程序设计(第三版)(第三版) 103定定义义含含义义intint i;i;定定义义整型整型变变量i量iintint* *p;p;pp为为指向整型数据的指指向整型数据的指针变针变量量int aint a[[n n]]; ;定定义义整型数整型数组组a,它有n个元素a,它有n个元素intint * *p[n];p[n];定定义义指指针针数数组组p,它由n个指向整型数据的指p,它由n个指向整型数据的指针针元素元素组组成成intint ((* *p)[n];p)[n];pp为为指向含n个元素的一指向含n个元素的一维维数数组组的指的指针变针变量量intint f();f();ff为带为带回整型函数回整型函数值值的函数的函数intint * *p();p();pp为带为带回一个指回一个指针针的函数,的函数,该该指指针针指向整型数据指向整型数据intint ((* *p)();p)();pp为为指向函数的指指向函数的指针针,,该该函数返回一个整型函数返回一个整型值值intint ** **p;p;p是一个指p是一个指针变针变量,它指向一个指向整型数据的量,它指向一个指向整型数据的指指针变针变量量 C程序程序设计(第三版)(第三版) 10410.8.2 10.8.2 指针运算小结指针运算小结(1) 指针变量加〔减〕一个整数例如:p++、p--、p+i、p-i、p+=i、p-=i等。

      C程序程序设计(第三版)(第三版) 105(2) 指针变量赋值指针变量赋值将一个变量地址赋给一个指针变量如:将一个变量地址赋给一个指针变量如:p=&a;p=&a; 〔将变量a的地址赋给p〕〔将变量a的地址赋给p〕p=p=array;; 〔将数组array首元素地址赋给p〔将数组array首元素地址赋给p〕〕p=&p=&array[i];〔将数组array第i个元素[i];〔将数组array第i个元素 的地址赋给p〕的地址赋给p〕p=p=max;〔max为已定义的函数,将max的入;〔max为已定义的函数,将max的入口口 地址赋给p〕地址赋给p〕p1=p2;〔p1和p2都是指针变量,将p2的p1=p2;〔p1和p2都是指针变量,将p2的 值赋给p1〕 值赋给p1〕  C程序程序设计(第三版)(第三版) 106(3) 指针变量可以有空值,即该指针变量不指向任指针变量可以有空值,即该指针变量不指向任何变量。

      何变量4) 两个指针变量可以相减两个指针变量可以相减假设两个指针变量都指向同一个数组中的元素,假设两个指针变量都指向同一个数组中的元素,那么两个指针变量值之差是两个指针之间的元素那么两个指针变量值之差是两个指针之间的元素个数个数 C程序程序设计(第三版)(第三版) 107(5) 两个指两个指针变量比量比较假假设两个指两个指针指向同一个数指向同一个数组的元素,那么可的元素,那么可以以进展比展比较指向前面的元素的指指向前面的元素的指针变量量“小小于〞指向后面元素的指于〞指向后面元素的指针变量 C程序程序设计(第三版)(第三版) 10810.8.3 void10.8.3 void指针类型指针类型• ANSIC新规范添加了一种“void〞指针类型,即可定义一个指针变量,但不指定它是指向哪一种类型数据的ANSIC规范规定用动态存储分配函数时前往void指针,它可以用来指向一个笼统的类型的数据,在将它的值赋给另一指针变量时要进展强迫类型转换使之适宜于被赋值的变量的类型例如:•char*p1;•void*p2;•…•p1=〔char *〕p2; C程序程序设计(第三版)(第三版) 109• 同样可以用〔void *〕p1将p1的值转换成void *类型。

      如:•p2=〔void *〕p1;•也可以将一个函数定义为void *类型,如:•void *fun〔char ch1,char ch2〕•表示函数fun前往的是一个地址,它指向“空类型〞,如需求援用此地址,也需求根据情况对之进展类型转换,如对该函数调用得到的地址要进展以下转换:•p1=〔char *〕fun〔ch1,ch2〕; 。

      点击阅读更多内容
      相关文档
      2025国开山东开大《土质学与土力学》形成性考核123答案+终结性考核答案.docx 中学综合素质知识点梳理【中学教师资格证】.docx 2025国开山东开大《特许经营概论》形成性考核123答案+终结性考核答案.doc 2025年高考英语全国一卷真题(含答案).docx 2025国开山东《农民专业合作社创建与管理》形成性考核123答案+终结性考核答案.docx 2025国开山东开大《自然现象探秘》形成性考核123答案+终结性考核答案.docx 2025国开山东《消费心理学》形成性考核123答案+终结性考核答案.doc 2025国开山东《小微企业管理》形成性考核123答案+终结性考核答案.doc 2025国开山东开大《资本经营》形成性考核123答案+终结性考试答案.docx 2025国开山东《小学生心理健康教育》形考123答案+终结性考试答案.docx 2025国开《视频策划与制作》形考任务1-4答案.docx 2025国开《亲子关系与亲子沟通》形考任务234答案+期末大作业答案.docx 2025国开电大《煤矿地质》形成性考核123答案.docx 2025国开电大《冶金原理》形考任务1234答案.docx 2025国开《在线学习项目运营与管理》形考任务1234答案.doc 2025国开电大《在线教育的理论与实践》阶段测验1-4答案.docx 2024 年注册环保工程师《专业基础考试》真题及答案解析【完整版】.docx 环保工程师---2023 年注册环保工程师《专业基础考试》真题及答案解析【完整版】.docx 2025国开《液压与气压传动》形考任务一参考答案.docx 2025年春江苏开放大学教育研究方法060616计分:形成性作业2、3答案.docx
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.