欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    C语言程序设计(第6章).rtf

    • 资源ID:70334405       资源大小:146.18KB        全文页数:14页
    • 资源格式: RTF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C语言程序设计(第6章).rtf

    第六章第六章第六章 指针指针指针计算机基础教研室计算机基础教研室计算机基础教研室 本章主要内容本章主要内容本章主要内容指针概述指针概述指针概述 地址地址地址 指指指针针针 指指指针变针变针变量量量 多重指多重指多重指针针针 指指指针变针变针变量作量作量作为为为函数参数函数参数函数参数 指针与数组指针与数组指针与数组 数数数组组组、指、指、指针针针与函数与函数与函数调调调用用用 行指行指行指针针针 指指指针针针数数数组组组 带带带参数的主函数参数的主函数参数的主函数 指针与函数指针与函数指针与函数 指向函数的指指向函数的指指向函数的指针变针变针变量量量 返回指返回指返回指针值针值针值的函数的函数的函数 教学目的与要求了解指针与地址的概念了解指针与函数的概念掌握指针变量的定义、初始化及指针的运算掌握指针与数组、指针数组、二级指针等知识掌握指针作为函数参数的应用重点与难点指针与地址的概念指针与变量的关系指针与数组指针与字符串指针数组与二级指针指针的应用一、指针概述一、指针概述一、指针概述1 1 1地址地址地址(addressaddressaddress)P201P201P201 如果在程序中定义了一个如果在程序中定义了一个如果在程序中定义了一个实体实体实体(变量、数组、函数变量、数组、函数变量、数组、函数 ),编译时系统就要给这些实体分配内存单元。),编译时系统就要给这些实体分配内存单元。),编译时系统就要给这些实体分配内存单元。分配规则:分配规则:分配规则:什么是内存单元什么是内存单元什么是内存单元“地址地址地址”?内存单元是以字节为单位,每个字节都有一个编号(即内存单元是以字节为单位,每个字节都有一个编号(即内存单元是以字节为单位,每个字节都有一个编号(即“地地地址址址”)。如果将内存比作一个旅馆,内存单元就好比)。如果将内存比作一个旅馆,内存单元就好比)。如果将内存比作一个旅馆,内存单元就好比“床位床位床位”,而实体则好比而实体则好比而实体则好比“旅客旅客旅客”。这些。这些。这些“旅客旅客旅客”(实体)中,有单人型(实体)中,有单人型(实体)中,有单人型(charcharchar)、夫妇型()、夫妇型()、夫妇型(intintint)、家庭型()、家庭型()、家庭型(float,long,doublefloat,long,doublefloat,long,double等)等)等),还有团体型(数组等)。每个还有团体型(数组等)。每个还有团体型(数组等)。每个“实体实体实体”占用的内存单元是不同占用的内存单元是不同占用的内存单元是不同的。如的。如的。如:charcharchar a;inta;inta;int b;floatb;floatb;float c;intc;intc;int d3;intd3;intd3;int max(max(max()内存单元与地址内存单元与地址内存单元与地址如何表示实体地址如何表示实体地址如何表示实体地址?实体地址表示法实体地址表示法实体地址表示法1 1 1:直接直接直接访问访问访问(实实实体名)体名)体名)普通变量普通变量普通变量a,b,ca,b,ca,b,c&a,&b,&c&a,&b,&c&a,&b,&c 数组数组数组d3d3d3 d d d(数组名(数组名(数组名),),),&d0&d0&d0,&d1&d1&d1,&d2&d2&d2 对二维数组,可用单下标法表示每行首地址。对二维数组,可用单下标法表示每行首地址。对二维数组,可用单下标法表示每行首地址。如如如 对对对charcharchar x34x34x34,可用,可用,可用x0 x0 x0、x1x1x1、x2x2x2分别表示其第分别表示其第分别表示其第 一、二、三行的首地址。一、二、三行的首地址。一、二、三行的首地址。函数函数函数max(max(max()maxmaxmax(函数名)(函数名)(函数名)“入口地址入口地址入口地址”&取地址运算符(适用于普通取地址运算符(适用于普通取地址运算符(适用于普通变变变量或数量或数量或数组组组元素)元素)元素)实体地址表示法实体地址表示法实体地址表示法2 2 2:间间间接接接访问访问访问(指指指针针针)适合于地址运算(加减等)适合于地址运算(加减等)适合于地址运算(加减等)2 2 2指针(指针(指针(pointerpointerpointer)实体地址的一种表示法实体地址的一种表示法实体地址的一种表示法(便于编程处理便于编程处理便于编程处理)。指针是一种特殊的数据类型指针是一种特殊的数据类型指针是一种特殊的数据类型存放的是某个实体的地址值。存放的是某个实体的地址值。存放的是某个实体的地址值。3 3 3指针变量指针变量指针变量 P202P202P202 存放存放存放“指针指针指针”(地址值)的特殊变量。(地址值)的特殊变量。(地址值)的特殊变量。定义方法:定义方法:定义方法:类型标识符类型标识符类型标识符 *变量名变量名变量名 如如如 intintint *a;a;a;charcharchar *b;b;b;floatfloatfloat *c;c;c;为什么要使用指针变量为什么要使用指针变量为什么要使用指针变量?C C C程序中访问(读写)变量有两种方式:程序中访问(读写)变量有两种方式:程序中访问(读写)变量有两种方式:直接访问直接访问直接访问 (按名单预留的座位入座)(按名单预留的座位入座)(按名单预留的座位入座)利用实体名访问变量。访问变量的过程利用实体名访问变量。访问变量的过程利用实体名访问变量。访问变量的过程 变量(实体)名变量(实体)名变量(实体)名定义时分配的地址定义时分配的地址定义时分配的地址变量值变量值变量值 好比好比好比“先坐再买票先坐再买票先坐再买票”看电影:来一个观众,分配一个空位给他去坐,并且还要在看电影:来一个观众,分配一个空位给他去坐,并且还要在看电影:来一个观众,分配一个空位给他去坐,并且还要在纸上记一个某人坐在哪里。这种方式对用户来说很方便(纸上记一个某人坐在哪里。这种方式对用户来说很方便(纸上记一个某人坐在哪里。这种方式对用户来说很方便(“直接就座直接就座直接就座”),但对系),但对系),但对系统来说,统来说,统来说,“找某人找某人找某人”就极不方便(间接:查名字座号)。就极不方便(间接:查名字座号)。就极不方便(间接:查名字座号)。间接访问间接访问间接访问 (先买票,后按号入座)(先买票,后按号入座)(先买票,后按号入座)把变量地址先存放在把变量地址先存放在把变量地址先存放在“指针指针指针”中,再通过中,再通过中,再通过“指针指针指针”访问变量。访问变量。访问变量。好比先买票(票好比先买票(票好比先买票(票指针,座号指针,座号指针,座号地址),再地址),再地址),再“按号入座按号入座按号入座”看电影。这种方式对用看电影。这种方式对用看电影。这种方式对用户来说属于户来说属于户来说属于“间接就座间接就座间接就座”,便对系统查找来说就很直接,且便于处理。尤其对于数,便对系统查找来说就很直接,且便于处理。尤其对于数,便对系统查找来说就很直接,且便于处理。尤其对于数组(团体),可通过指针简单自加或自减,对整个数组进行处理。组(团体),可通过指针简单自加或自减,对整个数组进行处理。组(团体),可通过指针简单自加或自减,对整个数组进行处理。指针变量指针变量指针变量不要谈不要谈不要谈”指指指”色变色变色变指针是指针是指针是C C C语言学习中的一大难点。语言学习中的一大难点。语言学习中的一大难点。难难难难在概念。难在概念。难在概念。首先首先首先搞定搞定搞定*p p p 请看以下变量声明语句请看以下变量声明语句请看以下变量声明语句 intintint a,*p1;a,*p1;a,*p1;charcharchar b,*p2;b,*p2;b,*p2;a,ba,ba,b 普通变量普通变量普通变量(存放某个数值或字符存放某个数值或字符存放某个数值或字符)p1,p2p1,p2p1,p2 指针变量指针变量指针变量(存放某个实体的地址存放某个实体的地址存放某个实体的地址)注意注意注意不同的不同的不同的*p p p以下程序中哪些语句是错误的?以下程序中哪些语句是错误的?以下程序中哪些语句是错误的?main()main()main()intintint a,*p;a,*p;a,*p;a=3;a=3;a=3;p=3;p=3;p=3;/*/*/*或者或者或者 p=a;*/p=a;*/p=a;*/p=&a;p=&a;p=&a;*p=a;*p=a;*p=a;/*/*/*或者或者或者*p=3*/p=3*/p=3*/有关有关有关*p p p的小结的小结的小结 变量声明时,变量声明时,变量声明时,*p p p表示定义了一个用来存放变量地址而非数据(数值、字符等表示定义了一个用来存放变量地址而非数据(数值、字符等表示定义了一个用来存放变量地址而非数据(数值、字符等)的的的指针变量。指针变量。指针变量。程序中引用时,程序中引用时,程序中引用时,*p p p表示取指针变量表示取指针变量表示取指针变量p p p所指变量的值。所指变量的值。所指变量的值。*p并非就这么简单并非就这么简单并非就这么简单 *p的含义与p所指的对象有关如果如果如果p p p被定义成指向普通变量的指针变量,则被定义成指向普通变量的指针变量,则被定义成指向普通变量的指针变量,则*p p p代表该变量的值。代表该变量的值。代表该变量的值。如如如 intintint *p*p*p,a=5a=5a=5;p=&a;p=&a;p=&a;则则则*p p p代表变量代表变量代表变量a a a的值的值的值(5)(5)(5)。如果如果如果p p p被定义成指向某个数组的指针变量,则被定义成指向某个数组的指针变量,则被定义成指向某个数组的指针变量,则*p p p代表该数组中某个元代表该数组中某个元代表该数组中某个元素的值。素的值。素的值。如如如 intintint *p,*p,*p,a3=1,2,3;a3=1,2,3;a3=1,2,3;p=a;p=a;p=a;则则则*p p p代表数组代表数组代表数组a a a中某个元素。中某个元素。中某个元素。看看两个例子看看两个例子看看两个例子#include#include#include main()main()main()intintint a,b=10,*p;a,b=10,*p;a,b=10,*p;system(cls);system(cls);system(cls);p=&b;p=&b;p=&b;a=*p+3;a=*p+3;a=*p+3;printf(a=%d,b=%dn,a,b);printf(a=%d,b=%dn,a,b);printf(a=%d,b=%dn,a,b);main()main()main()intintint *p,a12=1,2,3,4,5;*p,a12=1,2,3,4,5;*p,a12=1,2,3,4,5;clrscr();clrscr();clrscr();p=a;p=a;p=a;forforfor (;*p5;p+);*p5;p+);*p5;p+)printf(%d,*p);printf(%d,*p);printf(%d,*p);p p p指向字符数组时的指向字符数组时的指向字符数组时的*p p p如果如果如果p p p被定义成指向某个字符数组或某个字符串的指针变量,则被定义成指向某个字符数组或某个字符串的指针变量,则被定义成指向某个字符数组或某个字符串的指针变量,则*p p p代代代表某个字符。表某个字符。表某个字符。如如如 intintint *p,*p,*p,a3=”abcd”;a3=”abcd”;a3=”abcd”;p=a;p=a;p=a;p p p代表代表代表a a a中的某个字符中的某个字符中的某个字符&与与与*组合使用时组合使用时组合使用时 若若若 intintint a,a,a,*p;*p;*p;p=&a;p=&a;p=&a;则则则&*p&*p&*p =&a&a&a =p;p;p;*&a*&a*&a =a a a =*p*p*p小考一下,如何?小考一下,如何?小考一下,如何?指针变量能参加运算吗指针变量能参加运算吗指针变量能参加运算吗?指针变量和其他变量一样,可以在各种表达式中参加指针变量和其他变量一样,可以在各种表达式中参加指针变量和其他变量一样,可以在各种表达式中参加运算。运算。运算。但指针变量和普通变量不同但指针变量和普通变量不同但指针变量和普通变量不同,只能进行以下三种运算只能进行以下三种运算只能进行以下三种运算:赋值运算赋值运算赋值运算算术运算算术运算算术运算 指针比较指针比较指针比较指针变量的赋值运算指针变量的赋值运算指针变量的赋值运算指针变量初始化指针变量初始化指针变量初始化 变量声明时赋值变量声明时赋值变量声明时赋值典型错误典型错误典型错误指针变量定义后,未指向具体存储单元指针变量定义后,未指向具体存储单元指针变量定义后,未指向具体存储单元(实体地址实体地址实体地址)就使用,此就使用,此就使用,此时指针变量所指单元是任意的时指针变量所指单元是任意的时指针变量所指单元是任意的,是个是个是个”危险指针危险指针危险指针”。为什么未指向实体的指针是为什么未指向实体的指针是为什么未指向实体的指针是“危险指针危险指针危险指针”?空指针空指针空指针 P256空指针:空指针:空指针:intintint *p;*p;*p;p=NULL;p=NULL;p=NULL;讨论讨论讨论:以下程序中的以下程序中的以下程序中的*p1,*p2p1,*p2p1,*p2指针变量的算术运算指针变量的算术运算指针变量的算术运算指针只有两种算术运算指针只有两种算术运算指针只有两种算术运算加、减加、减加、减 p+5p+5p+5 p+p+p+p-1p-1p-1 p p p-注意加减运算是以实体为单位而不是以字节为单位。注意加减运算是以实体为单位而不是以字节为单位。注意加减运算是以实体为单位而不是以字节为单位。此外,两个指针变量可以相减。即:如果两个指针变量指向此外,两个指针变量可以相减。即:如果两个指针变量指向此外,两个指针变量可以相减。即:如果两个指针变量指向同一数组时,两个指针变量值之差是两个指针之间的元素个同一数组时,两个指针变量值之差是两个指针之间的元素个同一数组时,两个指针变量值之差是两个指针之间的元素个数。参见数。参见数。参见P256P256P256。但两个指针变量相加并无实际意义。但两个指针变量相加并无实际意义。但两个指针变量相加并无实际意义。以下程序哪个语句执行时会出错?以下程序哪个语句执行时会出错?以下程序哪个语句执行时会出错?#include#include#include main()main()main()intintint a10,*p1=a;a10,*p1=a;a10,*p1=a;clrscr();clrscr();clrscr();a+;a+;a+;p1+;p1+;p1+;指针的逻辑比较指针的逻辑比较指针的逻辑比较 P256 指针变量指向同一个对象(如数组)的不同单元地址时,才可以进行比较。地址在前者为小。指针变量指向同一个对象(如数组)的不同单元地址时,才可以进行比较。地址在前者为小。指针变量指向同一个对象(如数组)的不同单元地址时,才可以进行比较。地址在前者为小。任何指针变量或地址都可以与任何指针变量或地址都可以与任何指针变量或地址都可以与NULLNULLNULL作相等或不相等的比较。如作相等或不相等的比较。如作相等或不相等的比较。如 if(p=NULL)if(p=NULL)if(p=NULL)*p p p:多重指针多重指针多重指针 (指向指针的指针)指向指针的指针)指向指针的指针)P251P251P251 对于对于对于 intintint *p p p;定义一个二级指针(指向指针的指针)定义一个二级指针(指向指针的指针)定义一个二级指针(指向指针的指针)存放某个指针变量的地址:等效于存放某个指针变量的地址:等效于存放某个指针变量的地址:等效于 intintint *(*p)p)p)在引用时,在引用时,在引用时,*p p p是是是p p p间接指向的对象的地址。间接指向的对象的地址。间接指向的对象的地址。*p p p是是是p p p间接指向的对象的值。间接指向的对象的值。间接指向的对象的值。看了例子也许会明白的看了例子也许会明白的看了例子也许会明白的以下程序段的输出是什么?以下程序段的输出是什么?以下程序段的输出是什么?intintint *pp,*p,a=20,b=30;*pp,*p,a=20,b=30;*pp,*p,a=20,b=30;pp=&p;p=&a;p=&b;pp=&p;p=&a;p=&b;pp=&p;p=&a;p=&b;printf(“%d,%dn”,*p,*pp);printf(“%d,%dn”,*p,*pp);printf(“%d,%dn”,*p,*pp);指针变量作为函数参数使用指针变量作为函数参数使用指针变量作为函数参数使用main()void swap(int,int);int a=5,b=3,*p1,*p2;clrscr();p1=&a,p2=&b;swap(*p1,*p2);printf(a=%d,b=%dn,a,b);void swap(int x,int y)x=x-y;y=10;printf(x=%d,y=%dn,x,y);再看一个例子再看一个例子再看一个例子二、指针与数组二、指针与数组二、指针与数组 1 1 1、一维数组中的有关规定、一维数组中的有关规定、一维数组中的有关规定有何感觉?有何感觉?有何感觉?注意事项注意事项注意事项 注意指针变量当前值注意指针变量当前值注意指针变量当前值 P214P214P214 例例例10.610.610.6 注意不要超界注意不要超界注意不要超界 常见表示法:常见表示法:常见表示法:P215P215P215 *p+*p+*p+等价于等价于等价于*(p+)(p+)(p+)先取先取先取*p p p值,然后值,然后值,然后 p+p+p+。*(+p)(+p)(+p)p p p先自加,然后取先自加,然后取先自加,然后取*p p p的值。的值。的值。*p p p与与与 *(p)p)p)功能同上。功能同上。功能同上。小结:小结:小结:C C C语言的有关规定语言的有关规定语言的有关规定对对对一维数组一维数组一维数组一维数组的数组名的数组名的数组名 a a a:代表数组首地址(数组第一个元素代表数组首地址(数组第一个元素代表数组首地址(数组第一个元素a0a0a0的地址)的地址)的地址)即:即:即:a=&a0a=&a0a=&a0 *a=a0*a=a0*a=a0 a a ai i i 表示右移或左移表示右移或左移表示右移或左移 i i i 个元素位置个元素位置个元素位置 a+i=&aia+i=&aia+i=&ai *(a+i)=ai*(a+i)=ai*(a+i)=ai如果有指针变量如果有指针变量如果有指针变量 p=a;p=a;p=a;或或或 p=&a0;p=&a0;p=&a0;则则则 p p p 和和和 a a a 在程序中实际上可以互相替换使用。在程序中实际上可以互相替换使用。在程序中实际上可以互相替换使用。p=&a0p=&a0p=&a0 *p=a0*p=a0*p=a0 p+i=&aip+i=&aip+i=&ai *(p+i)=ai*(p+i)=ai*(p+i)=ai试一试看试一试看试一试看【例例例】有有有intintint a10=0,1,2,3,4,5,6,7,8,9,*p=a,i;a10=0,1,2,3,4,5,6,7,8,9,*p=a,i;a10=0,1,2,3,4,5,6,7,8,9,*p=a,i;其中其中其中0 0 0i i i101010,则对则对则对a a a数组元素不正确的引用是数组元素不正确的引用是数组元素不正确的引用是 。A A A)ap-aap-aap-a B B B)*(&ai)(&ai)(&ai)C C C)pipipi D D D)*(*(a+i)(*(a+i)(*(a+i)二维数组就没这么简单了二维数组就没这么简单了二维数组就没这么简单了2 2 2、二维数组中的有关规定、二维数组中的有关规定、二维数组中的有关规定二维数组的地址有二维数组的地址有二维数组的地址有”行地址行地址行地址”和和和”列地址列地址列地址”之分之分之分行地址表示是数组中的第几行行地址表示是数组中的第几行行地址表示是数组中的第几行(不带下标的数组名)行地址行地址行地址 a a a a+ia+ia+i *(a+i)*(a+i)*(a+i)a+1a+1a+1 或或或 a-1a-1a-1 表示下移或上移一行表示下移或上移一行表示下移或上移一行 列地址指第几个元素的地址列地址指第几个元素的地址列地址指第几个元素的地址(单下标或双下标+&)每行的首地址每行的首地址每行的首地址 a0a0a0 aiaiai&a00&a00&a00 都是列地址都是列地址都是列地址 列地址列地址列地址+1+1+1 或或或 列地址列地址列地址-1-1-1 表示左移或右移一位表示左移或右移一位表示左移或右移一位列地址是怎么回事?列地址是怎么回事?列地址是怎么回事?列地址:列地址:列地址:a0a0a0 aiaiai&a00&a00&a00 (单下标或双下标+&)使用列地址时,是将整个二维数组看成同一行。使用列地址时,是将整个二维数组看成同一行。使用列地址时,是将整个二维数组看成同一行。遍历数组时用单循环实现(将数组元素排队处理)遍历数组时用单循环实现(将数组元素排队处理)遍历数组时用单循环实现(将数组元素排队处理)不妨看一个示例不妨看一个示例不妨看一个示例#include#include#include main()main()main()intintint a33=1,2,3,4,5,6,7,8,9;a33=1,2,3,4,5,6,7,8,9;a33=1,2,3,4,5,6,7,8,9;intintint *p,i,j=0;*p,i,j=0;*p,i,j=0;system(cls);system(cls);system(cls);p=a;p=a;p=a;/*/*/*forforfor (i=0;i9;i+)(i=0;i9;i+)(i=0;i9;i+)*/*/*/printf(%dn,*(a0+1);printf(%dn,*(a0+1);printf(%dn,*(a0+1);行地址又是怎么回事呢?行地址又是怎么回事呢?行地址又是怎么回事呢?行地址:行地址:行地址:a a a a+ia+ia+i *(a+i)*(a+i)*(a+i)(不带下标的数组名)使用行地址时,是将整个二维数组看成使用行地址时,是将整个二维数组看成使用行地址时,是将整个二维数组看成i i i行行行j j j列。列。列。遍历数组时用双循环实现(将数组元素分行列处理)遍历数组时用双循环实现(将数组元素分行列处理)遍历数组时用双循环实现(将数组元素分行列处理)使用行指针时使用行指针时使用行指针时:a a a 和和和*a a a表示第表示第表示第0 0 0行的行地址行的行地址行的行地址 a+ia+ia+i 和和和 *(a+i)(a+i)(a+i)表示第表示第表示第i i i行的行地址行的行地址行的行地址 *(a+i)+j(a+i)+j(a+i)+j 表示第表示第表示第i i i行第行第行第j j j个元素的地址(个元素的地址(个元素的地址(=&aij)=&aij)=&aij)行地址本质上是二级地址,通过它取元素值时要多加一次行地址本质上是二级地址,通过它取元素值时要多加一次行地址本质上是二级地址,通过它取元素值时要多加一次*运算。运算。运算。*a a a 表示第表示第表示第0 0 0行行行0 0 0列元素值(列元素值(列元素值(=a00)=a00)=a00);*(*(a+i)(*(a+i)(*(a+i)表示第表示第表示第i i i行第行第行第0 0 0列元素值列元素值列元素值(=ai0);(=ai0);(=ai0);*(*(a+i)+j)*(*(a+i)+j)*(*(a+i)+j)表示第表示第表示第i i i行第行第行第j j j列元素值列元素值列元素值(=aij)(=aij)(=aij)。看两个例子看两个例子看两个例子#include#include#include main()main()main()intintint a33=1,2,3,4,5,6,7,8,9;a33=1,2,3,4,5,6,7,8,9;a33=1,2,3,4,5,6,7,8,9;intintint *p,i;*p,i;*p,i;system(cls);system(cls);system(cls);p=a;p=a;p=a;forforfor (i=0;i3;i+)(i=0;i3;i+)(i=0;i3;i+)printf(%dprintf(%dprintf(%d ,a+i);,a+i);,a+i);printf(%dprintf(%dprintf(%d%d%d%d%dn,%dn,%dn,&ai0,&ai1,&ai2);&ai0,&ai1,&ai2);&ai0,&ai1,&ai2);看一个例子看一个例子看一个例子#include#include#include main()main()main()intintint a33=1,2,3,4,5,6,7,8,9;a33=1,2,3,4,5,6,7,8,9;a33=1,2,3,4,5,6,7,8,9;intintint *p,i,j;*p,i,j;*p,i,j;system(cls);system(cls);system(cls);p=a;p=a;p=a;forforfor (i=0;i3;i+)(i=0;i3;i+)(i=0;i3;i+)for(j=0;j3;j+)for(j=0;j3;j+)for(j=0;j3;j+)printf(%dprintf(%dprintf(%d ,*(*(a+i)+j);,*(*(a+i)+j);,*(*(a+i)+j);用简单指针变量指向二维数组时用简单指针变量指向二维数组时用简单指针变量指向二维数组时用简单指针变量指向二维数组时:用简单指针变量指向二维数组时:用简单指针变量指向二维数组时:intintint a1010,*p;a1010,*p;a1010,*p;p=a;p=a;p=a;p p p都是列地址性质的指针(姑且称都是列地址性质的指针(姑且称都是列地址性质的指针(姑且称“列指针列指针列指针”)。此时,)。此时,)。此时,p p p可与可与可与“排队法排队法排队法”中的中的中的a0a0a0互换使用互换使用互换使用,但不能与但不能与但不能与“行列法行列法行列法”中的中的中的a a a互换使用互换使用互换使用。比较一下比较一下比较一下#include#include#include main()main()main()intintint a33=1,2,3,4,5,6,7,8,9;a33=1,2,3,4,5,6,7,8,9;a33=1,2,3,4,5,6,7,8,9;intintint *p,i;*p,i;*p,i;system(cls);system(cls);system(cls);p=a;p=a;p=a;forforfor (i=0;i9;i+)(i=0;i9;i+)(i=0;i9;i+)printf(%dn,*(p+i);printf(%dn,*(p+i);printf(%dn,*(p+i);再看下一个例子再看下一个例子再看下一个例子#include#include#include main()main()main()intintint a33=1,2,3,4,5,6,7,8,9;a33=1,2,3,4,5,6,7,8,9;a33=1,2,3,4,5,6,7,8,9;intintint *p,i,j;*p,i,j;*p,i,j;system(cls);system(cls);system(cls);p=a;p=a;p=a;forforfor (i=0;i3;i+)(i=0;i3;i+)(i=0;i3;i+)for(j=0;j3;j+)for(j=0;j3;j+)for(j=0;j3;j+)printf(%dprintf(%dprintf(%d ,*(*(a+i)+j);,*(*(a+i)+j);,*(*(a+i)+j);行指针行指针行指针 P229P229P229 形式:形式:形式:intintint (*p)n(*p)n(*p)n含义:含义:含义:p p p为指向含有为指向含有为指向含有n n n个元素的一维数组的指针变量。个元素的一维数组的指针变量。个元素的一维数组的指针变量。P255P255P255使用:二维数组可以视为由若干一维数组组成使用:二维数组可以视为由若干一维数组组成使用:二维数组可以视为由若干一维数组组成 。行指针行指针行指针p p p是行地址性质的指针是行地址性质的指针是行地址性质的指针。此时此时此时,p p p可与可与可与“行列法行列法行列法”中的中的中的a a a互互互换使用,但不能与换使用,但不能与换使用,但不能与“排队法排队法排队法”中的中的中的a0a0a0互换使用。互换使用。互换使用。行指针是如何使用的行指针是如何使用的行指针是如何使用的?若若若 intintint a45;a45;a45;intintint (*p)5;(*p)5;(*p)5;p=ap=ap=a;或;或;或p=a0;p=a0;p=a0;则则则 (*p)0=a00;(*p)0=a00;(*p)0=a00;(*p)1=a01;(*p)1=a01;(*p)1=a01;(*p)2=a02;(*p)2=a02;(*p)2=a02;(*(p+1)0=a10;(*(p+1)0=a10;(*(p+1)0=a10;(*(p+1)1=a11;(*(p+1)1=a11;(*(p+1)1=a11;示例一示例一示例一main()main()main()intintint a33=1,2,3,4,5,6,7,8,9;a33=1,2,3,4,5,6,7,8,9;a33=1,2,3,4,5,6,7,8,9;intintint (*p)3,i,j;(*p)3,i,j;(*p)3,i,j;p=a;p=a;p=a;for(i=0;i3;i+)for(i=0;i3;i+)for(i=0;i3;i+)for(j=0;j3;j+)for(j=0;j3;j+)for(j=0;j1)(argc1)(argc1)printf(%sprintf(%sprintf(%s ,argv-argc);,argv-argc);,argv-argc);printf(n);printf(n);printf(n);将该文件编译后,在命令行输入:将该文件编译后,在命令行输入:将该文件编译后,在命令行输入:testtesttest abcabcabc 123123123则该程序运行结果是什则该程序运行结果是什则该程序运行结果是什么?么?么?指针数组的典型应用指针数组的典型应用指针数组的典型应用 P253P253P253 【例二例二例二】以下程序经过编译连接后得到的可执行文件名为以下程序经过编译连接后得到的可执行文件名为以下程序经过编译连接后得到的可执行文件名为echo.exeecho.exeecho.exe,在,在,在dosdosdos提示符提示符提示符下输入下输入下输入 ,则在屏幕上将显示,则在屏幕上将显示,则在屏幕上将显示MyMyMy computercomputercomputer。#include#include#include main(intmain(intmain(int argc,charargc,charargc,char *argv)*argv)*argv)intintint i;i;i;forforfor (i=1;iargc;i+)(i=1;iargc;i+)(i=1;iargc;i+)printf(%s%c,argvi,(iargc-1)?printf(%s%c,argvi,(iargc-1)?printf(%s%c,argvi,(iargc-1)?:n);:n);:n);A A A)MyMyMy computercomputercomputer B)B)B)echoechoecho MyMyMy computercomputercomputerC)C)C)MycomputerMycomputerMycomputer D)D)D)main(Mymain(Mymain(My computer)computer)computer)三、指针与函数三、指针与函数三、指针与函数1 1 1、指向函数的指针变量、指向函数的指针变量、指向函数的指针变量 P241P241P241 可以用指针变量指向一个函数。一个函数在编译时被分配给一个可以用指针变量指向一个函数。一个函数在编译时被分配给一个可以用指针变量指向一个函数。一个函数在编译时被分配给一个“入入入口地址口地址口地址”。定义方法:定义方法:定义方法:类型标识符类型标识符类型标识符 (*指针变量名)();指针变量名)();指针变量名)();如如如 intintint (*p)(*p)(*p)();););指向一个返回整型值的函数指向一个返回整型值的函数指向一个返回整型值的函数用法:用法:用法:设有函数设有函数设有函数fun(a,b)fun(a,b)fun(a,b)令令令p=funp=funp=fun;则有则有则有 (*p p p)(a,b)(a,b)(a,b)相当于相当于相当于 fun(a,b);fun(a,b);fun(a,b);此时此时此时c=(*p)(a,bc=(*p)(a,bc=(*p)(a,b )与与与c=fun(a,b)c=fun(a,b)c=fun(a,b)等效。等效。等效。三、指针与函数三、指针与函数三、指针与函数2 2 2、返回指针值的函数、返回指针值的函数、返回指针值的函数 P246P246P246 一般形式一般形式一般形式 intintint *a(x,y)*a(x,y)*a(x,y);表示该函数的返回值是一个指针。表示该函数的返回值是一个指针。表示该函数的返回值是一个指针。本章作业本章作业本章作业1 1 1、所给程序段是把从键盘输入的一行字符作为字符串放在字符数组中所给程序段是把从键盘输入的一行字符作为字符串放在字符数组中所给程序段是把从键盘输入的一行字符作为字符串放在字符数组中,然后输出然后输出然后输出。请填空。请填空。请填空。2 2 2、所给源程序经编译、连接后得到的可执行文件名为所给源程序经编译、连接后得到的可执行文件名为所给源程序经编译、连接后得到的可执行文件名为file.exefile.exefile.exe。已知在系统的命令。已知在系统的命令。已知在系统的命令状态下输入命令行状态下输入命令行状态下输入命令行 filefilefile BeijingBeijingBeijing ShanghaiShanghaiShanghai 得到的输出是得到的输出是得到的输出是 BeijingBeijingBeijing ShanghaiShanghaiShanghai 请填空。请填空。请填空。

    注意事项

    本文(C语言程序设计(第6章).rtf)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开