语言二级辅导指针课件

上传人:无*** 文档编号:241793507 上传时间:2024-07-24 格式:PPTX 页数:52 大小:416.12KB
返回 下载 相关 举报
语言二级辅导指针课件_第1页
第1页 / 共52页
语言二级辅导指针课件_第2页
第2页 / 共52页
语言二级辅导指针课件_第3页
第3页 / 共52页
点击查看更多>>
资源描述
2024/7/241指针概念指针概念指针概念指针概念 地址、指针和指针变量的含义和表示地址、指针和指针变量的含义和表示地址、指针和指针变量的含义和表示地址、指针和指针变量的含义和表示掌握掌握掌握掌握指针与地址运算符指针与地址运算符指针与地址运算符指针与地址运算符 取地址运算符取地址运算符取地址运算符取地址运算符&和取内容运算符和取内容运算符和取内容运算符和取内容运算符*理解理解理解理解用指针处理数组、用指针处理数组、用指针处理数组、用指针处理数组、字符串字符串字符串字符串 数组、字符串的指针以及指向数组、字符串的指针变数组、字符串的指针以及指向数组、字符串的指针变数组、字符串的指针以及指向数组、字符串的指针变数组、字符串的指针以及指向数组、字符串的指针变量量量量 通过指针引用以上各类型数据通过指针引用以上各类型数据通过指针引用以上各类型数据通过指针引用以上各类型数据理解理解理解理解理解理解理解理解用指针作函数参数用指针作函数参数用指针作函数参数用指针作函数参数 通过指针类型参数传递计算结果,改变主调函数实参通过指针类型参数传递计算结果,改变主调函数实参通过指针类型参数传递计算结果,改变主调函数实参通过指针类型参数传递计算结果,改变主调函数实参值值值值理解理解理解理解指针的高级功能指针的高级功能指针的高级功能指针的高级功能 函数指针函数指针函数指针函数指针-返回指针值的的指针函数返回指针值的的指针函数返回指针值的的指针函数返回指针值的的指针函数 指针数组、指向指针的指针指针数组、指向指针的指针指针数组、指向指针的指针指针数组、指向指针的指针 main main main main函数的命令行参数简介函数的命令行参数简介函数的命令行参数简介函数的命令行参数简介知道知道知道知道知道知道知道知道知道知道知道知道指针指针2024/7/242内容提要内容提要内容提要内容提要 指针的概念;指针的概念;指针的概念;指针的概念;难点:对指针数据类型的理解难点:对指针数据类型的理解难点:对指针数据类型的理解难点:对指针数据类型的理解 用指针做函数参数;用指针做函数参数;用指针做函数参数;用指针做函数参数;利用字符指针存取字符串;利用字符指针存取字符串;利用字符指针存取字符串;利用字符指针存取字符串;字符数组和字符指针的区别与联系字符数组和字符指针的区别与联系字符数组和字符指针的区别与联系字符数组和字符指针的区别与联系 指针数组应用;指针数组应用;指针数组应用;指针数组应用;指向数组的指针与指针数组的区别指向数组的指针与指针数组的区别指向数组的指针与指针数组的区别指向数组的指针与指针数组的区别 带参数的带参数的带参数的带参数的mainmain函数;函数;函数;函数;动态内存分配函数及其应用;动态内存分配函数及其应用;动态内存分配函数及其应用;动态内存分配函数及其应用;一维、二维动态数组的实现一维、二维动态数组的实现一维、二维动态数组的实现一维、二维动态数组的实现2024/7/243为什么引入指针的概念为什么引入指针的概念为什么引入指针的概念为什么引入指针的概念 指针指针指针指针为函数提供修改变量值的手段为函数提供修改变量值的手段为函数提供修改变量值的手段为函数提供修改变量值的手段 为为为为C C的动态内存分配系统提供支持的动态内存分配系统提供支持的动态内存分配系统提供支持的动态内存分配系统提供支持 为动态数据结构(如例链表、队列、二叉树等)提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持 可以改善某些子程序的效率可以改善某些子程序的效率可以改善某些子程序的效率可以改善某些子程序的效率 2024/7/244 计算机内的存储部件,所有指令和数据都保存在计算机内的存储部件,所有指令和数据都保存在计算机内的存储部件,所有指令和数据都保存在计算机内的存储部件,所有指令和数据都保存在内存里内存里内存里内存里 速度快,但是掉电即失速度快,但是掉电即失速度快,但是掉电即失速度快,但是掉电即失 可以随机访问可以随机访问可以随机访问可以随机访问只要指明要访问的内存单元的只要指明要访问的内存单元的只要指明要访问的内存单元的只要指明要访问的内存单元的地址地址地址地址,就可以立即访问,就可以立即访问,就可以立即访问,就可以立即访问到该单元到该单元到该单元到该单元地址地址地址地址是一个无符号整数,其字长一般与主机相同是一个无符号整数,其字长一般与主机相同是一个无符号整数,其字长一般与主机相同是一个无符号整数,其字长一般与主机相同内存中的每个字节都有唯一的一个地址内存中的每个字节都有唯一的一个地址内存中的每个字节都有唯一的一个地址内存中的每个字节都有唯一的一个地址地址按字节编号,按类型分配空间地址按字节编号,按类型分配空间地址按字节编号,按类型分配空间地址按字节编号,按类型分配空间内存(内存(内存(内存(Random Access MemoryRandom Access Memory)地址(地址(地址(地址(AddressAddress)2024/7/245寻址方式寻址方式寻址方式寻址方式 如何读写内存中的数据?如何读写内存中的数据?如何读写内存中的数据?如何读写内存中的数据?通过变量的地址访问变量所在的通过变量的地址访问变量所在的通过变量的地址访问变量所在的通过变量的地址访问变量所在的存储单元存储单元存储单元存储单元 两种寻址方式两种寻址方式两种寻址方式两种寻址方式 直接(寻址)访问直接(寻址)访问直接(寻址)访问直接(寻址)访问通过变量地址直接存取变量内容通过变量地址直接存取变量内容通过变量地址直接存取变量内容通过变量地址直接存取变量内容 间接(寻址)访问间接(寻址)访问间接(寻址)访问间接(寻址)访问通过指针变量来间接存取它所指通过指针变量来间接存取它所指通过指针变量来间接存取它所指通过指针变量来间接存取它所指向的变量向的变量向的变量向的变量2024/7/246指针(指针(指针(指针(PointerPointer)的概念)的概念)的概念)的概念 指针也是一种数据类型指针也是一种数据类型指针也是一种数据类型指针也是一种数据类型 指针变量指针变量指针变量指针变量 声明为指针类型的变量,专门存放声明为指针类型的变量,专门存放声明为指针类型的变量,专门存放声明为指针类型的变量,专门存放地址数据地址数据地址数据地址数据的变量的变量的变量的变量 2024/7/247如何定义指针变量?如何定义指针变量?如何定义指针变量?如何定义指针变量?定义指针变量定义指针变量定义指针变量定义指针变量 intint*p;*p;定义了一个指针定义了一个指针定义了一个指针定义了一个指针变量变量变量变量p p,简称指针,简称指针,简称指针,简称指针p p p p是变量,是变量,是变量,是变量,intint*是类型是类型是类型是类型p p里保存一个地址。此时这个地址是什么呢(里保存一个地址。此时这个地址是什么呢(里保存一个地址。此时这个地址是什么呢(里保存一个地址。此时这个地址是什么呢(p p指向哪呢)?指向哪呢)?指向哪呢)?指向哪呢)?指针变量初始化指针变量初始化指针变量初始化指针变量初始化p=&a;p=&a;*p*p就像普通的变量一样使用,其值是就像普通的变量一样使用,其值是就像普通的变量一样使用,其值是就像普通的变量一样使用,其值是p p指向的内存的内容指向的内存的内容指向的内存的内容指向的内存的内容(在上例和(在上例和(在上例和(在上例和a a等价,但寻址方式不同)等价,但寻址方式不同)等价,但寻址方式不同)等价,但寻址方式不同)p p可以动态(任意)地指向不同内存,从而使可以动态(任意)地指向不同内存,从而使可以动态(任意)地指向不同内存,从而使可以动态(任意)地指向不同内存,从而使*p p代表不同的变代表不同的变代表不同的变代表不同的变量量量量2024/7/248int i,*p;p=&i;int *p;float*q;p=q;int i;float*p;p=&i;int*p;p=100;指针变量只指针变量只存放地址存放地址!一个指针变量不能一个指针变量不能指向与其类型不同指向与其类型不同的变量的变量!我是真的,我是真的,你猜对了吗?你猜对了吗?应在类型相应在类型相同的指针变同的指针变量之间赋值量之间赋值2024/7/249&与与与与*操作符操作符操作符操作符&用来取变量的地址用来取变量的地址用来取变量的地址用来取变量的地址intint i,*p;i,*p;p=&i;p=&i;intint*p,a10;*p,a10;p=a;p=a;intint*p,a10;*p,a10;p=&a0;p=&a0;intint*p,a10;*p,a10;p=&a5;p=&a5;*用来取指针指向地址的内容用来取指针指向地址的内容用来取指针指向地址的内容用来取指针指向地址的内容*p=0;*p=0;2024/7/2410指针变量与其它类型变量的对比指针变量与其它类型变量的对比指针变量与其它类型变量的对比指针变量与其它类型变量的对比 共性共性共性共性在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元先定义,后使用先定义,后使用先定义,后使用先定义,后使用 特殊性特殊性特殊性特殊性 它的内容只能是地址,而不能是数据它的内容只能是地址,而不能是数据它的内容只能是地址,而不能是数据它的内容只能是地址,而不能是数据必须初始化必须初始化必须初始化必须初始化后才能使用,否则指向不确定的存储单元,后才能使用,否则指向不确定的存储单元,后才能使用,否则指向不确定的存储单元,后才能使用,否则指向不确定的存储单元,对该空间进行访问,将可能造成危险对该空间进行访问,将可能造成危险对该空间进行访问,将可能造成危险对该空间进行访问,将可能造成危险可参与的运算:加、减一个整数,自增、自减、关系、可参与的运算:加、减一个整数,自增、自减、关系、可参与的运算:加、减一个整数,自增、自减、关系、可参与的运算:加、减一个整数,自增、自减、关系、赋值赋值赋值赋值只能指向同一基类型的变量只能指向同一基类型的变量只能指向同一基类型的变量只能指向同一基类型的变量2024/7/2411指针的指向指针的指向指针的指向指针的指向 只能指向同一基类型的变量,否则将引起只能指向同一基类型的变量,否则将引起只能指向同一基类型的变量,否则将引起只能指向同一基类型的变量,否则将引起warningwarningfloatfloat x;x;intint *p=&x;*p=&x;TCTC编译编译编译编译 warning:Suspicious pointer conversion in warning:Suspicious pointer conversion in function mainfunction mainVCVC编译编译编译编译 warning C4133:=:incompatible types-from warning C4133:=:incompatible types-from float*to int*float*to int*2024/7/2412指针运算指针运算指针运算指针运算 算术运算算术运算算术运算算术运算 intint*p,a10;*p,a10;p=a;p=a;p+;p+;/*p/*p的值增加多少?的值增加多少?的值增加多少?的值增加多少?*/指针的加减运算是以指针的加减运算是以指针的加减运算是以指针的加减运算是以其指向的其指向的其指向的其指向的类型的字节长度类型的字节长度类型的字节长度类型的字节长度为单位的为单位的为单位的为单位的6000600160026003600460056006p-1pp+12024/7/2413指针运算指针运算指针运算指针运算 intint*p,*q,a10;*p,*q,a10;p=a;p=a;q=&a5;q=&a5;q-p q-p q=p+3;q=p+3;指针运算不能乱算指针运算不能乱算指针运算不能乱算指针运算不能乱算一般只进行指针和整数的加减运算,同类型指针之一般只进行指针和整数的加减运算,同类型指针之一般只进行指针和整数的加减运算,同类型指针之一般只进行指针和整数的加减运算,同类型指针之间的减法运算间的减法运算间的减法运算间的减法运算其它运算,比如乘法、除法、浮点运算、指针之间其它运算,比如乘法、除法、浮点运算、指针之间其它运算,比如乘法、除法、浮点运算、指针之间其它运算,比如乘法、除法、浮点运算、指针之间的加法等,并无意义,所以也不支持的加法等,并无意义,所以也不支持的加法等,并无意义,所以也不支持的加法等,并无意义,所以也不支持2024/7/2414指针运算指针运算指针运算指针运算 关系运算关系运算关系运算关系运算 指向同一种数据类型的两个指针才能进行关系运算指向同一种数据类型的两个指针才能进行关系运算指向同一种数据类型的两个指针才能进行关系运算指向同一种数据类型的两个指针才能进行关系运算值为值为值为值为1 1或或或或0 0 p q p q p q p=q 不能与非指针类型变量进行比较,但可与不能与非指针类型变量进行比较,但可与不能与非指针类型变量进行比较,但可与不能与非指针类型变量进行比较,但可与NULL(NULL(即即即即0 0值值值值)进行等或不等的关系运算进行等或不等的关系运算进行等或不等的关系运算进行等或不等的关系运算判断判断判断判断p p是否为空指针是否为空指针是否为空指针是否为空指针P=NULLP=NULLp!=NULLp!=NULL2024/7/2415指针运算指针运算指针运算指针运算 赋值运算赋值运算赋值运算赋值运算 指针在使用前一定要赋值指针在使用前一定要赋值指针在使用前一定要赋值指针在使用前一定要赋值 为指针变量赋的值必须是一个地址为指针变量赋的值必须是一个地址为指针变量赋的值必须是一个地址为指针变量赋的值必须是一个地址mainmain()()intint*p;*p;scanf(%d,p);scanf(%d,p);mainmain()()intint a,*p=&a;a,*p=&a;scanf(%d,p);scanf(%d,p);错!但TC下不报错VC下报错2024/7/2416指针与函数指针与函数指针与函数指针与函数 指针既然是数据类型,自然可以做函数参数和返回值指针既然是数据类型,自然可以做函数参数和返回值指针既然是数据类型,自然可以做函数参数和返回值指针既然是数据类型,自然可以做函数参数和返回值的类型的类型的类型的类型 指针做函数参数的经典例子:指针做函数参数的经典例子:指针做函数参数的经典例子:指针做函数参数的经典例子:两数的互换两数的互换两数的互换两数的互换2024/7/2417void Swap(int*x,int*y)int temp;temp=*x;*x=*y;*y=temp;main()int a,b;a=15;b=8;Swap(&a,&b);printf(a=%d,b=%d,a,b);void Swap(int x,int y)int temp;temp=x;x=y;y=temp;main()int a,b;a=15;b=8;Swap(a,b);printf(a=%d,b=%d,a,b);程序程序 1程序程序 2 例:编写函数实现两数的互换主调函数主调函数被调被调函数函数实实 参参形形 参参结果有何不同?结果有何不同?2024/7/2418主调函数主调函数被调函数被调函数main()main()intint a,b;a,b;a=15;a=15;b=8;b=8;Swap(Swap(a,ba,b););printf(a=%d,b=%d,a,b);printf(a=%d,b=%d,a,b);voidvoid Swap(Swap(intint x,x,intint y y)intint temp;temp;temp=x;temp=x;x=y;x=y;y=temp;y=temp;55ab实实 参参形形 参参99xyab程序程序 1xy55temp92024/7/2419主调函数主调函数被调函数被调函数main()main()intint a,b;a,b;a=15;a=15;b=8;b=8;Swap(&Swap(&a,&ba,&b););printf(a=%d,b=%d,a,b);printf(a=%d,b=%d,a,b);voidvoid Swap(Swap(intint*x,*x,intint*y*y)intint temp;temp;temp=*x;temp=*x;*x=*y;*x=*y;*y=temp;*y=temp;&a&a实实 参参形形 参参&b&bxyab程序程序 2xy5temp5ab9952024/7/2420简单变量作函数参数与简单变量作函数参数与简单变量作函数参数与简单变量作函数参数与简单变量作函数参数与简单变量作函数参数与指针变量作函数参数的比较指针变量作函数参数的比较指针变量作函数参数的比较指针变量作函数参数的比较指针变量作函数参数的比较指针变量作函数参数的比较15 815 815 81515 8815 81515a)调用Swap函数(b)执行Swap函数c)从Swap函数返回temp xy bmain函数Swap函数aaatemptempxxy y bb1588 15&a&b&a&b15(a)调用Swap函数 (b)执行Swap函数 a a b b *x *x *y *y y y x x&a&b main函数 Swap函数 temptemp2024/7/2421swapswap函数的几种错误形式函数的几种错误形式函数的几种错误形式函数的几种错误形式(1/31/31/31/3)参数单向传递参数单向传递参数单向传递参数单向传递voidvoid Swap(Swap(intint x,x,intint y)y)intint temp;temp;temp=x;temp=x;/*x,y/*x,y为内部变量为内部变量为内部变量为内部变量*/x=y;x=y;y=temp;y=temp;2024/7/2422swapswap函数的几种错误形式函数的几种错误形式函数的几种错误形式函数的几种错误形式(2/32/32/32/3)参数单向传递参数单向传递参数单向传递参数单向传递voidvoid Swap(Swap(intint*p1,*p1,intint*p2)*p2)intint*p;*p;p=p1;p=p1;/*p1,p2/*p1,p2为内部变量为内部变量为内部变量为内部变量*/p1=p2;p1=p2;p2=p;p2=p;2024/7/2423swapswap函数的几种错误形式函数的几种错误形式函数的几种错误形式函数的几种错误形式(3/33/33/33/3)指针指针指针指针p p没有确切地址没有确切地址没有确切地址没有确切地址voidvoid Swap(Swap(intint*p1,*p1,int int*p2)*p2)intint*p;*p;/*/*指针指针指针指针p p未初始化未初始化未初始化未初始化*/*p=*p1;*p=*p1;*p1=*p2;*p1=*p2;*p2=*p;*p2=*p;2024/7/2424字符串与字符数组、字符指针字符串与字符数组、字符指针字符串与字符数组、字符指针字符串与字符数组、字符指针 C C语言并没有为字符串提供任何专门的表示法,完全语言并没有为字符串提供任何专门的表示法,完全语言并没有为字符串提供任何专门的表示法,完全语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理使用字符数组和字符指针来处理使用字符数组和字符指针来处理使用字符数组和字符指针来处理 字符串字符串字符串字符串一串以一串以一串以一串以00结尾的字符结尾的字符结尾的字符结尾的字符 字符数组字符数组字符数组字符数组每个元素都是字符类型的数组每个元素都是字符类型的数组每个元素都是字符类型的数组每个元素都是字符类型的数组 charchar string100;string100;字符指针字符指针字符指针字符指针指向字符类型的指针指向字符类型的指针指向字符类型的指针指向字符类型的指针 char char*p;*p;数组和指针可以等同看待,上面三者本质上是一回事数组和指针可以等同看待,上面三者本质上是一回事数组和指针可以等同看待,上面三者本质上是一回事数组和指针可以等同看待,上面三者本质上是一回事2024/7/2425字符指针变量与字符数组的区别字符指针变量与字符数组的区别字符指针变量与字符数组的区别字符指针变量与字符数组的区别 定义方法不同定义方法不同定义方法不同定义方法不同 chcharar str10;str10;chcharar*ptr;*ptr;赋值方法不同赋值方法不同赋值方法不同赋值方法不同 chcharar str10;str10;ptr=”china”;ptr=”china”;/*/*错误错误错误错误*/strcpy(str,”china”);strcpy(str,”china”);/*/*正确正确正确正确*/chcharar*ptr;*ptr;ptr=”china”;ptr=”china”;字符指针是变量,而数组名是地址常量字符指针是变量,而数组名是地址常量字符指针是变量,而数组名是地址常量字符指针是变量,而数组名是地址常量2024/7/2426使用字符指针的注意事项使用字符指针的注意事项使用字符指针的注意事项使用字符指针的注意事项 字符指针变量必须有明确的指向,否则字符指针变量必须有明确的指向,否则使用使用是危险的是危险的 例如,输入字符串时例如,输入字符串时例如,输入字符串时例如,输入字符串时 char char*a;*a;scanf(%s,a);scanf(%s,a);/*/*错误错误错误错误*/应为:应为:应为:应为:char char*a;*a;char char str10;str10;a=str;a=str;scanf(%s,a);scanf(%s,a);/*/*正确正确正确正确*/2024/7/2427例例例例:字符串拷贝字符串拷贝字符串拷贝字符串拷贝用字符数组编程用字符数组编程用字符数组编程用字符数组编程void void MyStrcpy(MyStrcpy(charchar dstStr,dstStr,charchar srcStr)srcStr)intint i=0;i=0;whilewhile(srcStri!=0)(srcStri!=0)dstStri=srcStri;dstStri=srcStri;i+;i+;dstStri=0;dstStri=0;下标:0 1 2 3 4 5 6 7 8 9 10 11 HelloChina0HelloChina0srcStridstStri下标移动方向dstStri=0srcStrdstStr结束拷贝ii+i 2024/7/2428voidvoid MyStrcpy(MyStrcpy(charchar*dstStr,*dstStr,const charconst char*srcStr)*srcStr)whilewhile(*srcStr!=0)(*srcStr!=0)*dstStr=*srcStr;*dstStr=*srcStr;srcStr+;srcStr+;dstStr+;dstStr+;*dstStr=0;*dstStr=0;当只允许函数访问地址内容,不允许修改当只允许函数访问地址内容,不允许修改时,可以把函数的指针参数定义为时,可以把函数的指针参数定义为constHelloChina0HelloChina0*srcStr*dstStr指针移动方向指针移动方向*to=0dstStrsrcStr+srcStrsrcStrdstStr+dstStr例字符串拷贝例字符串拷贝例字符串拷贝例字符串拷贝用字符指针编程用字符指针编程用字符指针编程用字符指针编程2024/7/2429例计算实际字符个数例计算实际字符个数例计算实际字符个数例计算实际字符个数 unsigned intunsigned int MyStrlen(MyStrlen(charchar str)str)intint i;i;unsigned intunsigned int len=0;len=0;forfor(i=0;stri!=0;i+)(i=0;stri!=0;i+)len+;len+;returnreturn(len);(len);unsigned int unsigned int MyStrlen(MyStrlen(char char*pStr)*pStr)unsigned intunsigned int len=0;len=0;forfor(;*pStr!=0;pStr+)(;*pStr!=0;pStr+)len+;len+;returnreturn(len);(len);方法方法方法方法2 2:用字符指针实现:用字符指针实现:用字符指针实现:用字符指针实现 方法方法方法方法1 1:用字符数组实现:用字符数组实现:用字符数组实现:用字符数组实现2024/7/2430指针与数组指针与数组指针与数组指针与数组 数组名就是一个指针数组名就是一个指针数组名就是一个指针数组名就是一个指针只是不能修改这个指针的指向只是不能修改这个指针的指向只是不能修改这个指针的指向只是不能修改这个指针的指向可以定义函数的参数为数组可以定义函数的参数为数组可以定义函数的参数为数组可以定义函数的参数为数组 指针也可当作数组名使用指针也可当作数组名使用指针也可当作数组名使用指针也可当作数组名使用intint*p,a10;*p,a10;p=a;p=a;数组元素的几种等价引用形式数组元素的几种等价引用形式数组元素的几种等价引用形式数组元素的几种等价引用形式aiai*(a+i)*(a+i)pipi*(p+i)*(p+i)60006001600260036004600560066007a0a1a2a3aa+1a+260006001600260036004600560066007a0a1a2a3app+p+2024/7/2431输入输出数组的全部元素输入输出数组的全部元素输入输出数组的全部元素输入输出数组的全部元素mainmain()()intint a10;a10;intint i;i;forfor(i=0;i10;i+)(i=0;i10;i+)scanf(%d,&ai);scanf(%d,&ai);forfor(i=0;i10;i+)(i=0;i10;i+)printf(%d,ai);printf(%d,ai);方法方法方法方法1 1:下标法下标法下标法下标法mainmain()()intint a10;a10;intint *p,i;*p,i;forfor(p=a;p(a+10);p+)(p=a;p(a+10);p+)scanf(%d,p);scanf(%d,p);forfor(p=a;p(a+10);p+)(p=a;p(a+10);p+)printf(%d,*p);printf(%d,*p);方法方法方法方法2 2:指针法指针法指针法指针法2024/7/2432指针与二维数组指针与二维数组指针与二维数组指针与二维数组 C C语言将二维数组看作一维数组,其每个数组元素语言将二维数组看作一维数组,其每个数组元素语言将二维数组看作一维数组,其每个数组元素语言将二维数组看作一维数组,其每个数组元素又是一个一维数组又是一个一维数组又是一个一维数组又是一个一维数组 按行顺序存放所有元素按行顺序存放所有元素按行顺序存放所有元素按行顺序存放所有元素a00a01a02a10a11a12aa0+0a+1a1+0a0+1a0+2&a00&a10&a11a1+1&a12&a01&a02 a00 a0a01a02a10 a1 a11a12 a a1+2intint a23;2024/7/2433例例例例 任意输入英文的星期几,在查找星期表后输出其对应任意输入英文的星期几,在查找星期表后输出其对应任意输入英文的星期几,在查找星期表后输出其对应任意输入英文的星期几,在查找星期表后输出其对应的数字。的数字。的数字。的数字。char weekDay710=char weekDay710=Sunday,Monday,Tuesday,Wednesday,Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;Thursday,Friday,Saturday;表表表表7-1 7-1 星期表的内容星期表的内容星期表的内容星期表的内容0 0SundaySunday1 1MondayMonday2 2TuesdayTuesday3 3WednesdayWednesday4 4ThursdayThursday5 5FridayFriday6 6SaturdaySaturdayweekDay0weekDay1weekDay2weekDay3weekDay4weekDay5weekDay6Sunday0Monday0Tuesday0Wednesday0Thursday0Friday0Saturday02024/7/2434#includeinclude main()main()intint i,pos;i,pos;intint findFlag=0;findFlag=0;charchar x10;x10;charchar weekDay10=Sunday,Monday,Tuesday,weekDay10=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Wednesday,Thursday,Friday,Saturday;Saturday;printf(Please enter a string:);printf(Please enter a string:);scanf(%s,x);scanf(%s,x);forfor(i=0;i 7&!findFlag;i+)(i=0;i 7&!findFlag;i+)ifif(strcmp(x,weekDayi)=0)(strcmp(x,weekDayi)=0)pos=i;pos=i;findFlag=1;findFlag=1;ifif(findFlag)(findFlag)printf(%s is%dn,x,pos);printf(%s is%dn,x,pos);elseelse printf(Not found!n);printf(Not found!n);例例例例weekDay0weekDay1weekDay2weekDay3weekDay4weekDay5weekDay6Sunday0Monday0Tuesday0Wednesday0Thursday0Friday0Saturday0 xSunday02024/7/2435指针与二维数组指针与二维数组指针与二维数组指针与二维数组 a a 代表代表代表代表二二二二维数组的首地址,维数组的首地址,维数组的首地址,维数组的首地址,第第第第0 0行行行行的地址的地址的地址的地址 a+i a+i 代表代表代表代表第第第第i i行行行行的地址的地址的地址的地址*(a(a+i)+i)即即即即 ai ai 代表代表代表代表第第第第i i行第行第行第行第0 0列列列列的地址的地址的地址的地址*(a(a+i)+j+i)+j 即即即即 ai+j ai+j 代表代表代表代表第第第第i i行第行第行第行第j j列列列列的地址的地址的地址的地址*(*(a(*(a+i)+j)+i)+j)即即即即 aij aij 代表代表代表代表第第第第i i行第行第行第行第j j列列列列的的的的元素元素元素元素行地址行地址行地址行地址转变成转变成转变成转变成列地址列地址列地址列地址2024/7/2436指针与二维数组指针与二维数组指针与二维数组指针与二维数组 二维数组的指针二维数组的指针二维数组的指针二维数组的指针列指针列指针列指针列指针int int*p;*p;p=*a;/p=*a;/用列地址初始化用列地址初始化用列地址初始化用列地址初始化 逐个元素查找元素所在位置逐个元素查找元素所在位置逐个元素查找元素所在位置逐个元素查找元素所在位置 相对于数组起始地址的偏移量相对于数组起始地址的偏移量相对于数组起始地址的偏移量相对于数组起始地址的偏移量i*n+ji*n+jforfor(i=0;im;i+)(i=0;im;i+)forfor(j=0;jn;j+)(j=0;jn;j+)printf(printf(%d%d,*(p+i*n+j)*(p+i*n+j););a00a01a02a10a11a12pp+2024/7/2437指针与二维数组指针与二维数组指针与二维数组指针与二维数组 二维数组的指针二维数组的指针二维数组的指针二维数组的指针行指针行指针行指针行指针int int(*p)3;p)3;p=a;/p=a;/用行地址初始化用行地址初始化用行地址初始化用行地址初始化 先逐行查找元素所在行先逐行查找元素所在行先逐行查找元素所在行先逐行查找元素所在行 再在行内逐列查找元素所在位置再在行内逐列查找元素所在位置再在行内逐列查找元素所在位置再在行内逐列查找元素所在位置forfor(i=0;im;i+)(i=0;im;i+)forfor(j=0;jn;j+)(j=0;jn;j+)printf(printf(%d%d,*(*(p+i)+j)*(*(p+i)+j););a00a01a02a10a11a12pp+2024/7/2438例例例例:在在在在一个班级一个班级一个班级一个班级中找出最高分及其中找出最高分及其中找出最高分及其中找出最高分及其学号学号学号学号 void void FindMax(FindMax(floatfloat score,score,longlong num,num,intint n,n,float float pMaxScore,pMaxScore,longlong pMaxNum)pMaxNum)intint i;i;pMaxScore=score0;pMaxScore=score0;pMaxNum=num0;pMaxNum=num0;forfor(i=1;in;i+)(i=1;i pMaxScore)(scorei pMaxScore)pMaxScore=scorei;pMaxScore=scorei;pMaxNum=numi;pMaxNum=numi;能返回这两个值吗?能返回这两个值吗?2024/7/2439例例例例 在在在在一个班级一个班级一个班级一个班级中找出最高分及其中找出最高分及其中找出最高分及其中找出最高分及其学号学号学号学号 void void FindMax(FindMax(floatfloat score,score,longlong num,num,intint n,n,float float*pMaxScore,*pMaxScore,longlong*pMaxNum)*pMaxNum)intint i;i;*pMaxScore=score0;*pMaxScore=score0;*pMaxNum=num0;*pMaxNum=num0;forfor(i=1;in;i+)(i=1;i*pMaxScore)(scorei *pMaxScore)*pMaxScore=scorei;*pMaxScore=scorei;*pMaxNum=numi;*pMaxNum=numi;指针参数指定了存放指针参数指定了存放这两个值的地址这两个值的地址2024/7/2440例例例例例例7.9:7.9:7.9:在在在在在在多个班级多个班级多个班级多个班级多个班级多个班级中找出最高分及其所在班级和学号中找出最高分及其所在班级和学号中找出最高分及其所在班级和学号中找出最高分及其所在班级和学号中找出最高分及其所在班级和学号中找出最高分及其所在班级和学号 intint FindMax(FindMax(intint pmnpmn,int m,int n,int m,int n,int*pRow,int*pCol)int*pRow,int*pCol)intint i,j,max;i,j,max;max=max=p00p00;*pRow=0;*pRow=0;*pCol=0;*pCol=0;forfor(i=0;im;i+)(i=0;im;i+)forfor(j=0;jn;j+)(j=0;j max)(pij max)max=pij;max=pij;*pRow=i;*pRow=i;*pCol=j;*pCol=j;returnreturn(max);(max);能这样传递能这样传递m个班(每个班(每班班n个学生)的成绩吗?个学生)的成绩吗?2024/7/2441intint FindMax(FindMax(intint *p*p,int m,int n,int*pRow,int*pCol),int m,int n,int*pRow,int*pCol)intint i,j,max;i,j,max;max=max=p0p0;*pRow=0;*pRow=0;*pCol=0;*pCol=0;forfor(i=0;im;i+)(i=0;im;i+)forfor(j=0;jn;j+)(j=0;j max)max)max=max=pi*n+jpi*n+j;*pRow=i;*pRow=i;*pCol=j;*pCol=j;returnreturn(max);(max);指定存储指定存储m个班(每班个班(每班n个学生)成绩的首地址个学生)成绩的首地址例在多个班级中找出最高分及其所在班级和学号例在多个班级中找出最高分及其所在班级和学号例在多个班级中找出最高分及其所在班级和学号例在多个班级中找出最高分及其所在班级和学号例在多个班级中找出最高分及其所在班级和学号例在多个班级中找出最高分及其所在班级和学号 2024/7/2442指针、数组以及其它的类型混合指针、数组以及其它的类型混合指针、数组以及其它的类型混合指针、数组以及其它的类型混合 基本数据类型基本数据类型基本数据类型基本数据类型intint、longlong、charchar、shortshort、floatfloat、doubledouble 指针是一种数据类型指针是一种数据类型指针是一种数据类型指针是一种数据类型是从其它类型派生的类型是从其它类型派生的类型是从其它类型派生的类型是从其它类型派生的类型 XXXX类型的指针类型的指针类型的指针类型的指针 数组也是一种数据类型数组也是一种数据类型数组也是一种数据类型数组也是一种数据类型是从其它类型派生的类型是从其它类型派生的类型是从其它类型派生的类型是从其它类型派生的类型 每个元素都有一个类型每个元素都有一个类型每个元素都有一个类型每个元素都有一个类型 任何类型都可以做指针或者数组的任何类型都可以做指针或者数组的任何类型都可以做指针或者数组的任何类型都可以做指针或者数组的基础类型基础类型基础类型基础类型它们自己也可以做彼此或自己的基础类型它们自己也可以做彼此或自己的基础类型它们自己也可以做彼此或自己的基础类型它们自己也可以做彼此或自己的基础类型2024/7/2443指针数组指针数组指针数组指针数组 元素均为指针类型数据的数组,称为指针数组元素均为指针类型数据的数组,称为指针数组元素均为指针类型数据的数组,称为指针数组元素均为指针类型数据的数组,称为指针数组 定义形式为:定义形式为:定义形式为:定义形式为:类型关键字类型关键字类型关键字类型关键字 *数组名数组名数组名数组名 数组长度数组长度数组长度数组长度;例如例如例如例如 char char*pStr5;*pStr5;pStrpStr55*charchar2024/7/2444例例例例main()main()intint i;i;charchar str10str10=Pascal,Basic,Fortran,=Pascal,Basic,Fortran,Java,Visual C;Java,Visual C;forfor(i=0;i5;i+)(i=0;i5;i+)printf(%sn,printf(%sn,stristri););strstr0str0Pascalstrstr11strstr22strstr33BasicFortranJava二维数组二维数组字符串字符串Visual Cstrstr442024/7/2445例例例例main()main()intint i;i;charchar *ptr*ptr=Pascal,Basic,Fortran,=Pascal,Basic,Fortran,Java,Visual C;Java,Visual C;forfor(i=0;i5;i+)(i=0;i5;i+)printf(%sn,printf(%sn,ptriptri););ptr0ptr0Pascalptrptr11ptrptr22ptrptr33BasicFortranJavaptr指针数组指针数组字符串字符串ptrVisual Cptrptr442024/7/2446例例例例字符串按字典顺序排序字符串按字典顺序排序字符串按字典顺序排序字符串按字典顺序排序二维数组编程二维数组编程二维数组编程二维数组编程charchar strN10=Pascal,Basic,Fortran,strN10=Pascal,Basic,Fortran,Java,Visual C;Java,Visual C;forfor(i=0;iN-1;i+)(i=0;iN-1;i+)forfor(j=i+1;jN;j+)(j=i+1;jN;j+)ifif(strcmp(strj,stri)0)(strcmp(strj,stri)0)strcpy(temp,stri);strcpy(temp,stri);strcpy(stri,strj);strcpy(stri,strj);strcpy(strj,temp);strcpy(strj,temp);strstrstrstrstrstrstrstrstrstrstrstrstrstrstrstrstrstrstrstr2024/7/2447例例例例字符串按字典顺序排序字符串按字典顺序排序字符串按字典顺序排序字符串按字典顺序排序指针数组编程指针数组编程指针数组编程指针数组编程charchar *ptrN=Pascal,Basic,Fortran,*ptrN=Pascal,Basic,Fortran,Java,Java,Visual C;Visual C;forfor(i=0;iN-1;i+)(i=0;iN-1;i+)forfor(j=i+1;jN;j+)(j=i+1;jN;j+)ifif(strcmp(ptrj,ptri)0)(strcmp(ptrj,ptri)1)(argc 1)printf(The other arguments are following:n);printf(The other arguments are following:n);forfor(i=1;iargc;i+)(i=1;iargc;i+)printf(%sn,argvi);printf(%sn,argvi);argv0argv0echo.exeargv1argv1argv2argv2argv3argv3programmingisfunptr指针数组指针数组字符串字符串name2024/7/2450动态分配内存动态分配内存动态分配内存动态分配内存#includeinclude#includeinclude voidvoid*malloc(*malloc(unsignedunsigned intint size);size);向系统申请大小为向系统申请大小为向系统申请大小为向系统申请大小为sizesize的内存块,把首地址返回。如果申请不成功,的内存块,把首地址返回。如果申请不成功,的内存块,把首地址返回。如果申请不成功,的内存块,把首地址返回。如果申请不成功,返回返回返回返回NULLNULL voidvoid*calloc(*calloc(unsigned intunsigned int num,num,unsignedunsigned intint size);size);向系统申请向系统申请向系统申请向系统申请numnum个个个个sizesize大小的内存块,把首地址返回。如果申请不大小的内存块,把首地址返回。如果申请不大小的内存块,把首地址返回。如果申请不大小的内存块,把首地址返回。如果申请不成功,返回成功,返回成功,返回成功,返回NULLNULL voidvoid free(free(voidvoid*p);*p);释放由释放由释放由释放由malloc()malloc()和和和和calloc()calloc()申请的内存块。申请的内存块。申请的内存块。申请的内存块。p p是指向此块的指针是指向此块的指针是指向此块的指针是指向此块的指针 voidvoid*类型的指针可以指向任意类型的变量类型的指针可以指向任意类型的变量类型的指针可以指向任意类型的变量类型的指针可以指向任意类型的变量2024/7/2451动态数组动态数组动态数组动态数组 一维动态数组一维动态数组一维动态数组一维动态数组 intint *p=NULL;*p=NULL;printf(Please enter array size:);printf(Please enter array size:);scanf(%d,&n);scanf(%d,&n);p=(p=(int*int*)malloc(n*)malloc(n*sizeofsizeof(int);(int);pi /pi /像使用一维数组一样使用像使用一维数组一样使用像使用一维数组一样使用像使用一维数组一样使用 二维动态数组二维动态数组二维动态数组二维动态数组例例例例7.147.14printf(Please enter array size m,n:);printf(Please enter array size m,n:);scanf(%d,%d,&m,&n);scanf(%d,%d,&m,&n);p=(p=(int*int*)calloc(m*n,)calloc(m*n,sizeofsizeof(int);(int);pi*n+j);/pi*n+j);/像使用一维数组一样使用像使用一维数组一样使用像使用一维数组一样使用像使用一维数组一样使用 2024/7/2452这一章我们学习了这一章我们学习了这一章我们学习了这一章我们学习了 指针的概念指针的概念指针的概念指针的概念指针是一种特殊的数据类型指针是一种特殊的数据类型指针是一种特殊的数据类型指针是一种特殊的数据类型 指针的使用原则指针的使用原则指针的使用原则指针的使用原则永远要清楚每个指针指向了什么位置永远要清楚每个指针指向了什么位置永远要清楚每个指针指向了什么位置永远要清楚每个指针指向了什么位置 永远要清楚每个指针指向的位置中的内容是什么永远要清楚每个指针指向的位置中的内容是什么永远要清楚每个指针指向的位置中的内容是什么永远要清楚每个指针指向的位置中的内容是什么 指针与数组之间的关系指针与数组之间的关系指针与数组之间的关系指针与数组之间的关系掌握二维数组在内存中的存放方式,是理解二维数组的掌握二维数组在内存中的存放方式,是理解二维数组的掌握二维数组在内存中的存放方式,是理解二维数组的掌握二维数组在内存中的存放方式,是理解二维数组的行指针和列指针的关键行指针和列指针的关键行指针和列指针的关键行指针和列指针的关键 指针的应用指针的应用指针的应用指针的应用做函数参数,传地址调用做函数参数,传地址调用做函数参数,传地址调用做函数参数,传地址调用动态分配内存,实现动态数组,对于动态分配的内存,动态分配内存,实现动态数组,对于动态分配的内存,动态分配内存,实现动态数组,对于动态分配的内存,动态分配内存,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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