收藏 分销(赏)

C语言指针讲解.ppt

上传人:可**** 文档编号:803348 上传时间:2024-03-22 格式:PPT 页数:102 大小:2.36MB
下载 相关 举报
C语言指针讲解.ppt_第1页
第1页 / 共102页
C语言指针讲解.ppt_第2页
第2页 / 共102页
C语言指针讲解.ppt_第3页
第3页 / 共102页
C语言指针讲解.ppt_第4页
第4页 / 共102页
C语言指针讲解.ppt_第5页
第5页 / 共102页
点击查看更多>>
资源描述

1、第十章l l 主要内容 10.1 10.1 地址和指针的概念地址和指针的概念 10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量 10.3 10.3 通过指针引用数组通过指针引用数组 10.4 10.4 通过指针字符串通过指针字符串 10.5 10.5 指向函数的指针指向函数的指针 10.6 10.6 返回指针值的函数返回指针值的函数 10.7 10.7 指针数组和多重指针指针数组和多重指针 10.8 10.8 动态内存分配与指向它的指针变量动态内存分配与指向它的指针变量 10.1地址和指针的概念 内存区的每一个字内存区的每一个字内存区的每一个字内存区的每一个字节

2、节有一个有一个有一个有一个编编号,号,号,号,这这就是就是就是就是“地址地址地址地址”。如果在程序中定。如果在程序中定。如果在程序中定。如果在程序中定义义了一个了一个了一个了一个变变量,在量,在量,在量,在对对程序程序程序程序进进行行行行编译时编译时,系,系,系,系统统就会就会就会就会给这给这个个个个变变量分配内存量分配内存量分配内存量分配内存单单元。元。元。元。、按变量地址存取变量值的方式称为、按变量地址存取变量值的方式称为、按变量地址存取变量值的方式称为、按变量地址存取变量值的方式称为“直接访问直接访问直接访问直接访问”方式方式方式方式 (,);,);,);,);(,);,);,);,);

3、2.2.另一种存取变量值的方式称为另一种存取变量值的方式称为另一种存取变量值的方式称为另一种存取变量值的方式称为“间接访问间接访问间接访问间接访问”的方式。即,将变量的地址存放在的方式。即,将变量的地址存放在的方式。即,将变量的地址存放在的方式。即,将变量的地址存放在另一个变量中。另一个变量中。另一个变量中。另一个变量中。在语言中,指针是一种特殊的变量,它是存放地址的。在语言中,指针是一种特殊的变量,它是存放地址的。在语言中,指针是一种特殊的变量,它是存放地址的。在语言中,指针是一种特殊的变量,它是存放地址的。一个一个一个一个变变量的地址称量的地址称量的地址称量的地址称为该变为该变量的量的量的

4、量的“指指针”。例如,地址例如,地址例如,地址例如,地址20002000是是是是变变量的指量的指量的指量的指针针。如果有一个。如果有一个。如果有一个。如果有一个变变量量量量专门专门用来存放另一用来存放另一用来存放另一用来存放另一变变量的量的量的量的地址(即指地址(即指地址(即指地址(即指针针),),),),则则它称它称它称它称为为“指指针变量量”。上述的。上述的。上述的。上述的i_pointeri_pointer就是一就是一就是一就是一个指个指个指个指针变针变量。量。量。量。指针和指针变量的定义:指针和指针变量的定义:10.2 变量的指针和指向变量的指针变量10.10.1.1 怎样定义指针变量

5、怎样定义指针变量定义指针变量的一般形式为定义指针变量的一般形式为定义指针变量的一般形式为定义指针变量的一般形式为基类型基类型基类型基类型 *指针变量名;指针变量名;指针变量名;指针变量名;下面都是合法的定义:下面都是合法的定义:下面都是合法的定义:下面都是合法的定义:float *pointer_float *pointer_;char*pointer_char*pointer_;可以用赋值语句使一个指针变量得到另一个变可以用赋值语句使一个指针变量得到另一个变可以用赋值语句使一个指针变量得到另一个变可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量。量的地址,从而使它指向

6、一个该变量。量的地址,从而使它指向一个该变量。量的地址,从而使它指向一个该变量。例如:例如:例如:例如:pointer_pointer_;pointer_pointer_;在定义指针变量时要注意两点:在定义指针变量时要注意两点:在定义指针变量时要注意两点:在定义指针变量时要注意两点:(1)(1)指针变量前面的指针变量前面的指针变量前面的指针变量前面的“*”“*”,表示该变量的类型为指针型变量。,表示该变量的类型为指针型变量。,表示该变量的类型为指针型变量。,表示该变量的类型为指针型变量。例例例例:float *pointer_1float *pointer_1;指针变量名是指针变量名是指针变量

7、名是指针变量名是pointer_1pointer_1 ,而不是,而不是,而不是,而不是*pointer_1pointer_1 。(2)(2)在定义指针变量时必须指定基类型。在定义指针变量时必须指定基类型。在定义指针变量时必须指定基类型。在定义指针变量时必须指定基类型。需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。下面需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。下面需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。下面需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。下面的赋值是错误的的赋值是错误的的赋值是

8、错误的的赋值是错误的 float a;float a;int *pointer_1;int *pointer_1;pointer_1=&a;pointer_1=&a;在对指针变量赋值时需要注意两点:在对指针变量赋值时需要注意两点:在对指针变量赋值时需要注意两点:在对指针变量赋值时需要注意两点:指针变量中只能存放地址(指针),不要将一个指针变量中只能存放地址(指针),不要将一个指针变量中只能存放地址(指针),不要将一个指针变量中只能存放地址(指针),不要将一个整数赋给一个指针变量。整数赋给一个指针变量。整数赋给一个指针变量。整数赋给一个指针变量。例例例例:*pointer_1*pointer_1

9、;/*pointer_1/*pointer_1是指针变量是指针变量是指针变量是指针变量,是整数,不合是整数,不合是整数,不合是整数,不合法法法法*/(2)(2)赋给指针变量的变是量地址不能是任意的类型,而只能是与指针变量的基类型赋给指针变量的变是量地址不能是任意的类型,而只能是与指针变量的基类型赋给指针变量的变是量地址不能是任意的类型,而只能是与指针变量的基类型赋给指针变量的变是量地址不能是任意的类型,而只能是与指针变量的基类型具有相同类型的变量的具有相同类型的变量的具有相同类型的变量的具有相同类型的变量的地址。地址。地址。地址。在引用指针变量时,可能有三种情况:在引用指针变量时,可能有三种情

10、况:在引用指针变量时,可能有三种情况:在引用指针变量时,可能有三种情况:给指针变量赋值。如:给指针变量赋值。如:给指针变量赋值。如:给指针变量赋值。如:p=&a;p=&a;引用指针变量的值。如:引用指针变量的值。如:引用指针变量的值。如:引用指针变量的值。如:printf(“%o”,p);printf(“%o”,p);引用指针变量指向的变量。引用指针变量指向的变量。引用指针变量指向的变量。引用指针变量指向的变量。有关的两个运算符:有关的两个运算符:有关的两个运算符:有关的两个运算符:(1)(1)取地址运算符。取地址运算符。取地址运算符。取地址运算符。&a&a是变量是变量是变量是变量a a的地址

11、。的地址。的地址。的地址。(2)(2)*指针运算符指针运算符指针运算符指针运算符 (或称(或称(或称(或称“间接访问间接访问间接访问间接访问”运算符),运算符),运算符),运算符),*p p是指针变量是指针变量是指针变量是指针变量p p指向的对象的指向的对象的指向的对象的指向的对象的值。值。值。值。10.2.2 10.2.2 怎样引用指针变量怎样引用指针变量例例10.通过指针变量访问整型变量通过指针变量访问整型变量#include#include voidvoidmain()main()int int,;,;,;,;intint *pointer_*pointer_,*pointer_poin

12、ter_;pointer_pointer_;/*/*把变量的地址赋给把变量的地址赋给把变量的地址赋给把变量的地址赋给 pointer_1*/pointer_1*/pointer_ pointer_;/*/*把变量的地址赋给把变量的地址赋给把变量的地址赋给把变量的地址赋给 pointer_pointer_*/printf printf(%,%,););););printfprintf(%,%,*pointer_,*pointer_,*pointer_,*pointer_););););例例例例10.2 10.2 输入和两个整数,按先大后小的顺序输出输入和两个整数,按先大后小的顺序输出输入和两个整

13、数,按先大后小的顺序输出输入和两个整数,按先大后小的顺序输出 和。和。和。和。#include#include void mainvoid main()()()()int*int*1 1,*2 2,*,;,;,;,;scanfscanf(,);,);,);,);1 1;if if()()()();printfprintf(=,=,););););printfprintf(max=max=,min=,min=,*,*1,*1,*2 2););););运行情况如下:运行情况如下:,当输入,时,由于,当输入,时,由于,将和交换。交换前的情况见图将和交换。交换前的情况见图(),交换后见图()。(),交

14、换后见图()。10.10.3.3 指针变量作为函数参数指针变量作为函数参数例例例例10.3 10.3 对输入的两个整数按大小顺序输出对输入的两个整数按大小顺序输出对输入的两个整数按大小顺序输出对输入的两个整数按大小顺序输出#include#include void mainvoid main()()()()void swapvoid swap(int*int*,int*int*);int int,;,;,;,;int*pointer_int*pointer_,*pointer_pointer_;scanfscanf(,);,);,);,);pointer_pointer_ ;pointer_2

15、 pointer_2;if if(swapswap(pointer_pointer_ ,pointer_2 pointer_2););););printfprintf(,);,);,);,);void swapvoid swap(int*int*,int*int*)int tempint temp;temptemp*1 1;*;*temptemp;例例例例10.10.输入输入输入输入3 3个整数个整数个整数个整数,,要求按大小顺序将它们输出。,要求按大小顺序将它们输出。,要求按大小顺序将它们输出。,要求按大小顺序将它们输出。用函数实现改变这用函数实现改变这用函数实现改变这用函数实现改变这3 3

16、个变量的值。个变量的值。个变量的值。个变量的值。#include#include void mainvoid main()()()()void exchangevoid exchange(int*int*1 1,int*int*2 2,int*int*3 3);int int ,*,*,*;scanfscanf(%,%,%,&,&,&,&,&););););exchange exchange(,);(,);(,);(,);printfprintf(,););););void exchangevoid exchange(int*int*,int*int*,int*int*)void swapvo

17、id swap(int*int*,int*int*);if if(*)swapswap(,);(,);(,);(,);if if(*)swapswap(,);(,);(,);(,);if if(*swapswap(,);(,);(,);(,);void swapvoid swap(int*int*,int*int*)int tempint temp;temptemp*;*;*temptemp;10.3 10.3 通过指针引用数组通过指针引用数组一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存一个变量有地址,一个

18、数组包含若干元素,每个数组元素都在内存中占用存一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓向数组元素(把某一元素的地址放到一个指针变量中)。所谓向数组元素(把某一元素的地址放到一个指针变量中)。所谓向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素

19、的指数组元素的指数组元素的指数组元素的指针就是数组元素的地址针就是数组元素的地址针就是数组元素的地址针就是数组元素的地址。10.3.1 10.3.1 数组元素的指针数组元素的指针可以可以可以可以用一个指针变量指向一个数组元素。用一个指针变量指向一个数组元素。用一个指针变量指向一个数组元素。用一个指针变量指向一个数组元素。例如:例如:例如:例如:;(定义为包含个整型数据的数组定义为包含个整型数据的数组定义为包含个整型数据的数组定义为包含个整型数据的数组)*;(定义为指向整型变量的指针变量定义为指向整型变量的指针变量定义为指向整型变量的指针变量定义为指向整型变量的指针变量);(把元素的地址赋给指针

20、变量把元素的地址赋给指针变量把元素的地址赋给指针变量把元素的地址赋给指针变量)也就是使指向数组的第号元素也就是使指向数组的第号元素也就是使指向数组的第号元素也就是使指向数组的第号元素 。语言规定在指针指向数组元素时,可以对指针进行以下运算:语言规定在指针指向数组元素时,可以对指针进行以下运算:语言规定在指针指向数组元素时,可以对指针进行以下运算:语言规定在指针指向数组元素时,可以对指针进行以下运算:加一个整数加一个整数加一个整数加一个整数(用用用用+或或或或+=)+=),如,如,如,如p+1p+1 减一个整数减一个整数减一个整数减一个整数(用用用用-或或或或-=)-=),如,如,如,如p-1p

21、-1 自加运算,如自加运算,如自加运算,如自加运算,如p+p+,+p+p 自减运算,如自减运算,如自减运算,如自减运算,如p-p-,-p-p 两个指针相减,如两个指针相减,如两个指针相减,如两个指针相减,如p1-p2(p1-p2(只有只有只有只有p1p1和和和和p2p2都指向同一数组中的元素时才都指向同一数组中的元素时才都指向同一数组中的元素时才都指向同一数组中的元素时才有意义有意义有意义有意义)。10.3.2 10.3.2 指针的运算指针的运算分别说明如下:分别说明如下:分别说明如下:分别说明如下:(1)(1)如果指针变量如果指针变量如果指针变量如果指针变量p p已指向数组中的一个元素,则已

22、指向数组中的一个元素,则已指向数组中的一个元素,则已指向数组中的一个元素,则指向同一数组中的下一个元素,指向同一数组中的下一个元素,指向同一数组中的下一个元素,指向同一数组中的下一个元素,-指向同一数组中指向同一数组中指向同一数组中指向同一数组中的上一个元素。的上一个元素。的上一个元素。的上一个元素。(2)(2)如果如果如果如果p p原来指向原来指向原来指向原来指向a0a0,执行,执行,执行,执行+p+p后后后后p p的值改变了,在的值改变了,在的值改变了,在的值改变了,在p p的原值基础上加的原值基础上加的原值基础上加的原值基础上加d d,这样,这样,这样,这样p p就指就指就指就指向数组的

23、下一个元素向数组的下一个元素向数组的下一个元素向数组的下一个元素a1a1。(3)(3)如果的初值为如果的初值为如果的初值为如果的初值为 ,则和就是数组元素的地址,或者,则和就是数组元素的地址,或者,则和就是数组元素的地址,或者,则和就是数组元素的地址,或者说,它们指向数组的第说,它们指向数组的第说,它们指向数组的第说,它们指向数组的第个元素个元素个元素个元素 。(4)(4)*()或()或()或()或*()是或所指向的数组元素,即。()是或所指向的数组元素,即。()是或所指向的数组元素,即。()是或所指向的数组元素,即。(5)(5)如果指针变量如果指针变量如果指针变量如果指针变量p1p1和和和和

24、p2p2都指向同一数组,如执行都指向同一数组,如执行都指向同一数组,如执行都指向同一数组,如执行p2-p1p2-p1,结果是两个地址之差除以数,结果是两个地址之差除以数,结果是两个地址之差除以数,结果是两个地址之差除以数组元素的长度。组元素的长度。组元素的长度。组元素的长度。10.10.3.3 通过指针引用数组元素通过指针引用数组元素 引用一个数组元素,可以用:引用一个数组元素,可以用:引用一个数组元素,可以用:引用一个数组元素,可以用:()()()()下标法,如形式;下标法,如形式;下标法,如形式;下标法,如形式;()()()()指针法,如指针法,如指针法,如指针法,如*()或()或()或(

25、)或*()()()()。其中是数组名,是指向数组。其中是数组名,是指向数组。其中是数组名,是指向数组。其中是数组名,是指向数组元素的指针变量,其初值。元素的指针变量,其初值。元素的指针变量,其初值。元素的指针变量,其初值。例例例例10.5 10.5 输出数组中的全部元素输出数组中的全部元素输出数组中的全部元素输出数组中的全部元素 假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:(1)(1)下标法下标法下标

26、法下标法#include#include void mainvoid main()()()()int int;intint;forfor(;)(;)(;)(;)scanfscanf(,);,);,);,);printfprintf(););););forfor(;)(;)(;)(;)printfprintf(,);,);,);,);(2)(2)通过数组名计算数组元素地址,找出元素的值。通过数组名计算数组元素地址,找出元素的值。通过数组名计算数组元素地址,找出元素的值。通过数组名计算数组元素地址,找出元素的值。#include#include voidvoidmainmain()()()()in

27、t int;int int;forfor(;(;(;(;)scanfscanf(,);,);,);,);printfprintf(););););forfor(;)(;)(;)(;)printfprintf(,*();();();();(3)(3)用指针变量指向数组元素。用指针变量指向数组元素。用指针变量指向数组元素。用指针变量指向数组元素。#include#include void mainvoid main()()()()int int;int *int *,;,;,;,;forfor(;)(;)(;)(;)scanfscanf(,);,);,);,);printfprintf(););)

28、;);forfor(;();)(;();)(;();)(;();)printfprintf(,*););););例例例例10.10.通过指针变量输出数组的个元素。通过指针变量输出数组的个元素。通过指针变量输出数组的个元素。通过指针变量输出数组的个元素。#include#include void mainvoid main()()()()intint *,;,;,;,;forfor(;(;(;(;)scanfscanf(,);,);,);,);printfprintf(););););forfor(;,(;,(;,(;,)printfprintf(,*););););程序运行情况:程序运行情况:

29、程序运行情况:程序运行情况:1 2 3 4 5 6 7 10 9 01 2 3 4 5 6 7 10 9 0 22153 234 0 0 30036 25202 11631 10259 10237 210410322153 234 0 0 30036 25202 11631 10259 10237 2104103显然输出的数值并不是数组中各元素的值显然输出的数值并不是数组中各元素的值显然输出的数值并不是数组中各元素的值显然输出的数值并不是数组中各元素的值#include#include void void mainmain()()()()intint *,;,;,;,;forfor(;)(;)

30、(;)(;)scanfscanf(,);,);,);,);printgprintg(););););p=a;p=a;forfor(;,(;,(;,(;,)printfprintf(,*););););程序运行情况:程序运行情况:程序运行情况:程序运行情况:1 2 3 4 5 6 7 10 9 01 2 3 4 5 6 7 10 9 0 1 2 3 4 5 6 7 10 9 01 2 3 4 5 6 7 10 9 010.3.4 10.3.4 用数组名作函数参数用数组名作函数参数在第在第在第在第7 7章中介绍过可以用数组名作函数的参数。章中介绍过可以用数组名作函数的参数。章中介绍过可以用数组名作

31、函数的参数。章中介绍过可以用数组名作函数的参数。如:如:如:如:void mainvoid main()()()()i i(int arrint arr,int int);int array int array;(arrayarray,);,);,);,);void void(int arr(int arr,int int)例例10 将数组中个整数按相反顺序存放将数组中个整数按相反顺序存放#include#include void mainvoid main()()()()void invvoid inv(int int ,int int);int int,;,;,;,;printfprint

32、f(The original array:The original array:););););forfor(;)(;)(;)(;)printf printf(,);,);,);,);printfprintf(););););inv inv(,);(,);(,);(,);printfprintf(The array has been in vertedThe array has been in verted:););););forfor(;)(;)(;)(;)printf printf(,);,);,);,);printf printf(););););void invvoid inv(int

33、 int ,int int)/*/*形参形参形参形参x x是数组名是数组名是数组名是数组名*/int tempint temp,();,();,();,();forfor(;)(;)(;)(;);temptemp;temptemp;returnreturn;运行情况如下:运行情况如下:运行情况如下:运行情况如下:The original arrayThe original array:,The array has been invertedThe array has been inverted:,#include#include void mainvoid main()()()()void i

34、nvvoid inv(int*int*,int int);int int,;,;,;,;printfprintf(The original array:The original array:););););forfor(;)(;)(;)(;)printf printf(,);,);,);,);printf printf(););););invinv(,);(,);(,);(,);printf printf(The array has been in vertedThe array has been in verted:););););forfor(;)(;)(;)(;)printf print

35、f(,);,);,);,);printf printf(););););对刚才的程序可以作一些改动。将函数对刚才的程序可以作一些改动。将函数对刚才的程序可以作一些改动。将函数对刚才的程序可以作一些改动。将函数invinv中的形参中的形参中的形参中的形参改成指针变量。改成指针变量。改成指针变量。改成指针变量。void invvoid inv(int*int*,int int)/*/*形参形参形参形参x x为指针变量为指针变量为指针变量为指针变量*/intint ,temptemp,*,*,();,();,();,();forfor(;,)(;,)(;,)(;,)empemp*;*;*tempte

36、mp;returnreturn;如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下种情况:形参的对应关系有以下种情况:形参的对应关系有以下种情况:形参的对应关系有以下种情况:(1)(1)形参和实参都用数组名,如:形参和实参都用数组名,如:形参和实参都用数组名,如:形参和实参都用数组名,如:void mainvoid main()()()()void void (int int ,int

37、int)int int;(,);(,);(,);(,);(2)(2)实参用数组名,形参用指针变量。如:实参用数组名,形参用指针变量。如:实参用数组名,形参用指针变量。如:实参用数组名,形参用指针变量。如:void void()()()()void void(int*int*,int int)int int ;(,);(,);(,);(,);(3)(3)实参形参都用指针变量。例如:实参形参都用指针变量。例如:实参形参都用指针变量。例如:实参形参都用指针变量。例如:void void mainmain()()()()void void(int*int*,int int)int int,*p=a;,

38、*p=a;(p p,);,);,);,);(4)(4)实参为指针变量,形参为数组名。如:实参为指针变量,形参为数组名。如:实参为指针变量,形参为数组名。如:实参为指针变量,形参为数组名。如:void mainvoid main()()()()void void(int x int x,int int),*p=a,*p=a;(p p,);,);,);,);#include#include void mainvoid main()()()()void inv void inv(int*int*,int int);int int,*;printfprintf(The original array:n

39、 The original array:n););););forfor(;,)(;,)(;,)(;,)scanfscanf(,);,);,);,);printfprintf(););););invinv(,);(,);(,);(,);/*/*实参为指针变量实参为指针变量实参为指针变量实参为指针变量*/printf printf(The array has been inverted The array has been inverted:););););forfor(;(;(;(;)printfprintf(,*););););printfprintf(););););例例108 用实参指针变

40、量改写例用实参指针变量改写例10.。void invvoid inv(int*int*,int int)intint ,temptemp,*,*;();();();();forfor(;,)(;,)(;,)(;,)empemp*;*;*temptemp;returnreturn;例例例例10109 9 用选择法对个整数按由大到小顺序排序用选择法对个整数按由大到小顺序排序用选择法对个整数按由大到小顺序排序用选择法对个整数按由大到小顺序排序#include#include void mainvoid main()()()()void sort void sort(int int ,int int)

41、;int int *,1010;forfor(;)(;)(;)(;)scanfscanf(,);,);,);,);sortsort(,);(,);(,);(,);forfor(,;)(,;)(,;)(,;)(,*););););void sortvoid sort(int int ,int int)int int,;,;,;,;forfor(;)(;)(;)(;);forfor(;)(;)(;)(;)()()()();(!)(!)(!)(!);10.3.5 10.3.5 通过指针引用多维数组通过指针引用多维数组用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念用指针变量可

42、以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。上和使用上,多维数组的指针比一维数组的指针要复杂一些。上和使用上,多维数组的指针比一维数组的指针要复杂一些。上和使用上,多维数组的指针比一维数组的指针要复杂一些。1.1.1.1.多维数组元素的地址多维数组元素的地址多维数组元素的地址多维数组元素的地址先回顾一下多维数组的性质先回顾一下多维数组的性质先回顾一下多维数组的性质先回顾一下多维数组的

43、性质,可以认为二维数组是可以认为二维数组是可以认为二维数组是可以认为二维数组是“数组的数组数组的数组数组的数组数组的数组”,例,例,例,例 :定义定义定义定义int aint a3 34 4=1=1,3 3,5 5,77,;则二维数组则二维数组则二维数组则二维数组a a是由是由是由是由3 3个一维数组所组成的。设二维数组的首行的首地址为个一维数组所组成的。设二维数组的首行的首地址为个一维数组所组成的。设二维数组的首行的首地址为个一维数组所组成的。设二维数组的首行的首地址为 ,则,则,则,则表表 示示 形形 式式含义含义地地 址址a a a a 二维数组名,指向一维数组二维数组名,指向一维数组二

44、维数组名,指向一维数组二维数组名,指向一维数组a0a0a0a0,即,即,即,即0 0 0 0行首地址行首地址行首地址行首地址2000200020002000a0a0a0a0,*(a+0),*(a+0),*(a+0),*(a+0),*a*a*a*a0 0 0 0行行行行0 0 0 0列元素地址列元素地址列元素地址列元素地址2000200020002000a+1a+1a+1a+1,&a&a&a&a1 1 1 11 1 1 1行首地址行首地址行首地址行首地址20010200102001020010a a a a1 1 1 1,*(a+1),*(a+1),*(a+1),*(a+1)1 1 1 1行行行

45、行0 0 0 0列元素列元素列元素列元素a10a10a10a10的地址的地址的地址的地址20010200102001020010a1+2,a1+2,a1+2,a1+2,*(a+1)+2,*(a+1)+2,*(a+1)+2,*(a+1)+2,&a12&a12&a12&a121 1 1 1行行行行2 2 2 2列元素列元素列元素列元素a12 a12 a12 a12 的地址的地址的地址的地址2012201220122012*(a1+2),*(a1+2),*(a1+2),*(a1+2),*(*(a+1)+2),*(*(a+1)+2),*(*(a+1)+2),*(*(a+1)+2),a12a12a12a

46、121 1 1 1行行行行2 2 2 2列元素列元素列元素列元素a a a a1 1 1 12 2 2 2的值的值的值的值元素值为元素值为元素值为元素值为131313132.2.2.2.指向多维数组元素的指针变量指向多维数组元素的指针变量指向多维数组元素的指针变量指向多维数组元素的指针变量(1)(1)指向数组元素的指针变量指向数组元素的指针变量指向数组元素的指针变量指向数组元素的指针变量例例例例10.10 10.10 10.10 10.10 用指向元素的指针变量输出二维数组元素的值用指向元素的指针变量输出二维数组元素的值用指向元素的指针变量输出二维数组元素的值用指向元素的指针变量输出二维数组元

47、素的值#include#include void mainvoid main()()()()int int 34341,3,5,7,9,11,13,15,17,19,21,231,3,5,7,9,11,13,15,17,19,21,23;intint *;forfor(;)(;)(;)(;)()()()()printfprintf(););););printfprintf(,*););););运行结果如下:运行结果如下:运行结果如下:运行结果如下:1 3 5 71 3 5 7 9 11 13 15 9 11 13 1519 21 23 19 21 23 (2)(2)用指向由个元素组成的一维数组

48、的指针变量用指向由个元素组成的一维数组的指针变量用指向由个元素组成的一维数组的指针变量用指向由个元素组成的一维数组的指针变量 例例例例10.11 10.11 10.11 10.11 输出二维数组任一行任一列元素的值输出二维数组任一行任一列元素的值输出二维数组任一行任一列元素的值输出二维数组任一行任一列元素的值#include#include void main()void main()int int 1 1,3 3,5 5,7 7,9 9,1111,1313,1515,;,;,;,;int int(*),;),;),;),;scanfscanf(,);,);,);,);printfprintf

49、(,*(*();();();();运行情况如下:运行情况如下:运行情况如下:运行情况如下:,(本行为键盘输入)(本行为键盘输入)(本行为键盘输入)(本行为键盘输入),3.3.用指向数组的指针作函数参数用指向数组的指针作函数参数用指向数组的指针作函数参数用指向数组的指针作函数参数例例例例10.12 10.12 10.12 10.12 有一个班,个学生,各学门课,计算总平均分数以及第个学生的成有一个班,个学生,各学门课,计算总平均分数以及第个学生的成有一个班,个学生,各学门课,计算总平均分数以及第个学生的成有一个班,个学生,各学门课,计算总平均分数以及第个学生的成绩。这个题目是很简单的。只是为了说

50、明用指向数组的指针作函数参数而举的例子。绩。这个题目是很简单的。只是为了说明用指向数组的指针作函数参数而举的例子。绩。这个题目是很简单的。只是为了说明用指向数组的指针作函数参数而举的例子。绩。这个题目是很简单的。只是为了说明用指向数组的指针作函数参数而举的例子。用函数用函数用函数用函数averageaverageaverageaverage求总平均成绩,用函数求总平均成绩,用函数求总平均成绩,用函数求总平均成绩,用函数searchsearchsearchsearch找出并输出第个学生的成绩。找出并输出第个学生的成绩。找出并输出第个学生的成绩。找出并输出第个学生的成绩。#include#incl

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服