C语言程序设计第11章指针和数组课件

上传人:文**** 文档编号:240608878 上传时间:2024-04-24 格式:PPT 页数:43 大小:2.31MB
收藏 版权申诉 举报 下载
C语言程序设计第11章指针和数组课件_第1页
第1页 / 共43页
C语言程序设计第11章指针和数组课件_第2页
第2页 / 共43页
C语言程序设计第11章指针和数组课件_第3页
第3页 / 共43页
资源描述:

《C语言程序设计第11章指针和数组课件》由会员分享,可在线阅读,更多相关《C语言程序设计第11章指针和数组课件(43页珍藏版)》请在装配图网上搜索。

1、第第第第11111111章章章章 指针和数组指针和数组指针和数组指针和数组2024/4/242/42本章学习内容本章学习内容 指针与一维数组间的关系,指针与二维指针与一维数组间的关系,指针与二维数组间的关系数组间的关系 向函数传递一维数组和二维数组向函数传递一维数组和二维数组 指针数组,命令行参数指针数组,命令行参数 动态数组,动态内存分配动态数组,动态内存分配2024/4/243/4211.1 指针和一维数组间的关系指针和一维数组间的关系 intint a4=1,2,3,4;a4=1,2,3,4;0 0 x0037b000 x0037b000a0a00 0 x0037b004x0037b00

2、40 0 x0037b008x0037b0080 0 x0037b00Bx0037b00Ba a.1intint *pa=a;pa=a;papaintint *pa=&a0;pa=&a0;234a1a1a2a2a3a3数组名是一个常量指针数组名是一个常量指针数组名是一个常量指针数组名是一个常量指针不能修改该指针的指向不能修改该指针的指向不能修改该指针的指向不能修改该指针的指向指针可当数组名使用指针可当数组名使用指针可当数组名使用指针可当数组名使用2024/4/244/4211.1 指针和一维数组间的关系指针和一维数组间的关系 intint a4=1,2,3,4;a4=1,2,3,4;0 0 x

3、0037b000 x0037b000a0a00 0 x0037b004x0037b0040 0 x0037b008x0037b0080 0 x0037b00Bx0037b00Ba a.1intint *pa=a;pa=a;papaintint *pa=&a0;pa=&a0;234a1a1a2a2a3a3数组元素的等价引用形式数组元素的等价引用形式数组元素的等价引用形式数组元素的等价引用形式aiai*(a+i)*(a+i)paipai*(pa+i)*(pa+i)a+1a+1*(a+1)*(a+1)pa0pa0*(pa+2)*(pa+2)pa+2pa+2*pa*pa2024/4/245/4211.

4、1 指针和一维数组间的关系指针和一维数组间的关系 intint a4=1,2,3,4;a4=1,2,3,4;0 0 x0037b000 x0037b000a0a00 0 x0037b004x0037b0040 0 x0037b008x0037b0080 0 x0037b00Bx0037b00Ba a.1p p234a1a1a2a2a3a3for(i=0;i4;i+)scanf(%d,&ai);for(i=0;i4;i+)printf(%d,ai);for(p=a;p(a+4);p+)scanf(%d,p);for(p=a;p(a+4);p+)printf(%d,*p);*p*p*p*pa+4a

5、+42024/4/246/4211.1 指针和一维数组间的关系指针和一维数组间的关系【例例例例11.111.111.111.1】演示数组元素的引用方法演示数组元素的引用方法演示数组元素的引用方法演示数组元素的引用方法 2024/4/247/4211.1 指针和一维数组间的关系指针和一维数组间的关系【例例例例11.111.111.111.1】演示数组元素的引用方法演示数组元素的引用方法演示数组元素的引用方法演示数组元素的引用方法 2024/4/248/4211.1 指针和一维数组间的关系指针和一维数组间的关系【例例例例11.211.211.211.2】演示数组和指针变量作函数参数演示数组和指针变

6、量作函数参数演示数组和指针变量作函数参数演示数组和指针变量作函数参数 被调函数的形参声明为被调函数的形参声明为数组类型,用下标法访数组类型,用下标法访问数组元素问数组元素2024/4/249/4211.1 指针和一维数组间的关系指针和一维数组间的关系【例例例例11.211.211.211.2】演示数组和指针变量作函数参数演示数组和指针变量作函数参数演示数组和指针变量作函数参数演示数组和指针变量作函数参数 被调函数的形参声明为被调函数的形参声明为指针指针类型类型,用指针法访,用指针法访问数组元素问数组元素2024/4/2410/4211.1 指针和一维数组间的关系指针和一维数组间的关系【例例例例

7、11.211.211.211.2】演示数组和指针变量作函数参数演示数组和指针变量作函数参数演示数组和指针变量作函数参数演示数组和指针变量作函数参数 在主函数中这样做没有在主函数中这样做没有多大的实际意义多大的实际意义2024/4/2411/4211.2 指针和二维数组间的关系指针和二维数组间的关系 可将二维数组看作一维数组,其每个数组元素又是可将二维数组看作一维数组,其每个数组元素又是可将二维数组看作一维数组,其每个数组元素又是可将二维数组看作一维数组,其每个数组元素又是一个一维数组一个一维数组一个一维数组一个一维数组 按行顺序存放所有元素按行顺序存放所有元素按行顺序存放所有元素按行顺序存放所

8、有元素a00a01a02a10a11a12a0a0a1a1a0+1a0+2&a0a000&a1a100&a11a1+1&a12&a01&a02 a00 a0a01a02a10 a1 a11a12 a a1+2shortshort a23;a aa a+1+12024/4/2412/4211.2 指针和二维数组间的关系指针和二维数组间的关系a00a01a02a10a11a12 a00 a0a01a02a10 a1 a11a12 a shortshort a23;a aa a+1+1a 代表代表二二维数组的首地址,维数组的首地址,第第0 0行行的地址,的地址,行地址行地址行地址行地址a+i 代表代

9、表第第i i行行的地址的地址但并非增加但并非增加i i个字节!个字节!2024/4/2413/42a00a01a02a10a11a12a0a0a1a1&a0a000&a1a100 a00 a0a01a02a10 a1 a11a12 a shortshort a23;*(a+i)即即 ai 代表代表第第i行行第第第第0 0列列列列的地址的地址,列地址列地址列地址列地址a aa a+1+1*(a+i)+j 即即 ai+j代表代表第第i行行第第第第j j列列列列的地址的地址&aij&a12a1+211.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的

10、关系2024/4/2414/42a00a01a02a10a11a12a0a0a1a1&a0a000&a1a100 a00 a0a01a02a10 a1 a11a12 a shortshort a23;a aa a+1+1&a12a1+2*(*(a+i)+j)即即 aij 代表代表第第i行第行第j列列的的内容内容内容内容*(a+i)即即 ai 代表代表第第i行行第第第第0 0列列列列的地址的地址,列地址列地址列地址列地址*(a+i)+j 即即 ai+j代表代表第第i行行第第第第j j列列列列的地址的地址&aij 11.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关

11、系指针和二维数组间的关系2024/4/2415/42 二维数组的二维数组的二维数组的二维数组的行行行行指针指针指针指针int int(*p)3;p)3;p=a;p=a;/用行地址初始化用行地址初始化用行地址初始化用行地址初始化 逐行查找逐行查找逐行查找逐行查找-逐列查找逐列查找逐列查找逐列查找pshortshort a23;a00a01a02a10a11a12a12a aa+1a+111.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系2024/4/2416/42 二维数组的二维数组的二维数组的二维数组的行行行行指针指针指针指针int in

12、t(*p)3;p)3;p=a;p=a;/用行地址初始化用行地址初始化用行地址初始化用行地址初始化 逐行查找逐行查找逐行查找逐行查找-逐列查找逐列查找逐列查找逐列查找pshortshort a23;a00a01a02a10a11a12a+1a+1a a11.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系2024/4/2417/42 二维数组的二维数组的二维数组的二维数组的行行行行指针指针指针指针int int(*p)3;p)3;p=a;p=a;/用行地址初始化用行地址初始化用行地址初始化用行地址初始化 逐行查找逐行查找逐行查找逐行查找-逐列

13、查找逐列查找逐列查找逐列查找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););shortshort a23;a00a01a02a10a11a12pa aa+1a+111.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系2024/4/2418/42 二维数组的二维数组的二维数组的二维数组的列列列列指针指针指针指针int int*p;p;p=p=*a;a;/用列地址初始化用列地址初始化用列地址初始

14、化用列地址初始化 逐个查找逐个查找逐个查找逐个查找相对偏移量相对偏移量相对偏移量相对偏移量forfor(i=0;im;i+)(i=0;im;i+)forfor(j=0;jn;j+)(j=0;jn;j+)printf(printf(%d%d,*(p+*(p+i*n+ji*n+j););pshortshort a23;a00a01a02a10a11a12*a*a或或或或a0a0pi*n+ji*n+j11.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系2024/4/2419/42【例例例例11.311.311.311.3】输入一个输入一个输入一

15、个输入一个3 3 3 3行行行行4 4 4 4列的列的列的列的二维数组,然后输出这个二维数组,然后输出这个二维数组,然后输出这个二维数组,然后输出这个二维数组的元素值二维数组的元素值二维数组的元素值二维数组的元素值 11.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系2024/4/2420/42【例例例例11.311.311.311.3】输入一个输入一个输入一个输入一个3 3 3 3行行行行4 4 4 4列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输出这个二维数组的元素值出这个二维数组的元素值出这个二维数

16、组的元素值出这个二维数组的元素值 11.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系形参声明为列数已知的形参声明为列数已知的二维数组二维数组2024/4/2421/42【例例例例11.311.311.311.3】输入一个输入一个输入一个输入一个3 3 3 3行行行行4 4 4 4列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输出这个二维数组的元素值出这个二维数组的元素值出这个二维数组的元素值出这个二维数组的元素值 11.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和

17、二维数组间的关系形参声明为指向列数已知形参声明为指向列数已知的二维数组的行指针的二维数组的行指针2024/4/2422/42【例例例例11.311.311.311.3】输入一个输入一个输入一个输入一个3 3 3 3行行行行4 4 4 4列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输出这个二维数组的元素值出这个二维数组的元素值出这个二维数组的元素值出这个二维数组的元素值 11.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系形参声明为指向二维数组形参声明为指向二维数组的列指针的列指针2024/4/2423/4

18、2【例例例例11.311.311.311.3】输入一个输入一个输入一个输入一个3 3 3 3行行行行4 4 4 4列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输出这个二维数组的元素值出这个二维数组的元素值出这个二维数组的元素值出这个二维数组的元素值 11.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系2024/4/2424/42指针和数组作函数参数指针和数组作函数参数 通过指针或数组参数,使调用者获得修改后的通过指针或数组参数,使调用者获得修改后的通过指针或数组参数,使调用者获得修改后的通过指针或数组参数

19、,使调用者获得修改后的数据数据数据数据 通过一个参数把大量的数据送到函数内通过一个参数把大量的数据送到函数内通过一个参数把大量的数据送到函数内通过一个参数把大量的数据送到函数内如果只向内传送数据,就把参数定义为如果只向内传送数据,就把参数定义为如果只向内传送数据,就把参数定义为如果只向内传送数据,就把参数定义为constconst,防,防,防,防止意外修改数据,也让函数的功能更明确止意外修改数据,也让函数的功能更明确止意外修改数据,也让函数的功能更明确止意外修改数据,也让函数的功能更明确 voidvoid PrintArray(PrintArray(constconst int*int*p,p

20、,intint n)n).voidvoid PrintArray(PrintArray(constconst intint a,a,intint n)n).2024/4/2425/42指针、数组以及其他的类型混合指针、数组以及其他的类型混合 基本数据类型基本数据类型基本数据类型基本数据类型intint、longlong、charchar、shortshort、floatfloat、doubledouble 数组是一种数据类型数组是一种数据类型数组是一种数据类型数组是一种数据类型是从其他类型派生的类型是从其他类型派生的类型是从其他类型派生的类型是从其他类型派生的类型 每个元素都有一个类型每个元素

21、都有一个类型每个元素都有一个类型每个元素都有一个类型 指针是一种数据类型指针是一种数据类型指针是一种数据类型指针是一种数据类型是从其他类型派生的类型是从其他类型派生的类型是从其他类型派生的类型是从其他类型派生的类型 XXXXXXXX类型的指针类型的指针类型的指针类型的指针 任何类型都可以作指针或者数组的任何类型都可以作指针或者数组的任何类型都可以作指针或者数组的任何类型都可以作指针或者数组的基类型基类型基类型基类型2024/4/2426/4211.3指针数组及其应用指针数组及其应用 用指针作数组的基类型用指针作数组的基类型用指针作数组的基类型用指针作数组的基类型?指针数组指针数组指针数组指针数

22、组(Pointer ArrayPointer ArrayPointer ArrayPointer Array)元素均为指针类型数据的数组元素均为指针类型数据的数组元素均为指针类型数据的数组元素均为指针类型数据的数组 定义形式为:定义形式为:定义形式为:定义形式为:数据类型数据类型数据类型数据类型 *数组名数组名数组名数组名 数组长度数组长度数组长度数组长度;例如例如例如例如char*char*ptr5;ptr5;ptrptr55*charchar2024/4/2427/42第第10章章【例例10.4】国名国名字符串排序字符串排序二维数组二维数组charchar namenameNNMAX_LE

23、NMAX_LEN;.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)0strcmp(strj,stri)0)strcpy(temp,stri);strcpy(temp,stri);strcpy(stri,strj);strcpy(stri,strj);strcpy(strj,temp);strcpy(strj,temp);MAX_LENMAX_LENN N交换字符数组中的字符串交换字符数组中的字符串物理排序物理排序2024/4/2428/42【例例11.4】国名国名字符串

24、排序字符串排序指针数组指针数组charchar *ptrN;*ptrN;.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)0strcmp(ptrj,ptri)1)(x1)为指向每个参数的字符指针为指向每个参数的字符指针为指向每个参数的字符指针为指向每个参数的字符指针2024/4/2432/42【例例11.5】演示命令行参数与演示命令行参数与main函数各形参之间的关系函数各形参之间的关系 intint main(int argc,char*argv)main(int ar

25、gc,char*argv)intint i;i;printf(The number of command line arguments is:%dn,argc);printf(The number of command line arguments is:%dn,argc);printf(The program name is:%sn,argv0);printf(The program name is:%sn,argv0);ifif(argc 1)(argc 1)printf(The other arguments are following:n);printf(The other argum

26、ents are following:n);forfor(i=1;i(i=1;i 1)(argc 1)printf(The other arguments are following:n);printf(The other arguments are following:n);forfor(i=1;i(i=1;iargcargc;i+);i+)printf(%sn,printf(%sn,argviargvi););return 0;return 0;The number of command line arguments is:4The program name is:echo.exeThe

27、other arguments are following:programming is fun2024/4/2434/4211.4.1 C程序的内存映像程序的内存映像 C C程序中变量的内存分配方式程序中变量的内存分配方式 从静态存储区分配从静态存储区分配从静态存储区分配从静态存储区分配 全局变量和静态变量全局变量和静态变量全局变量和静态变量全局变量和静态变量 在栈上创建在栈上创建在栈上创建在栈上创建 存放函数参数值、局部变量值等存放函数参数值、局部变量值等存放函数参数值、局部变量值等存放函数参数值、局部变量值等 在执行函数调用时,系统在栈上为函数内的局部变量及形在执行函数调用时,系统在栈上

28、为函数内的局部变量及形在执行函数调用时,系统在栈上为函数内的局部变量及形在执行函数调用时,系统在栈上为函数内的局部变量及形参分配内存,函数执行结束时,自动释放这些内存参分配内存,函数执行结束时,自动释放这些内存参分配内存,函数执行结束时,自动释放这些内存参分配内存,函数执行结束时,自动释放这些内存从堆上分配从堆上分配从堆上分配从堆上分配 在程序运行期间,用动态内存分配函数来申请的内存都是在程序运行期间,用动态内存分配函数来申请的内存都是在程序运行期间,用动态内存分配函数来申请的内存都是在程序运行期间,用动态内存分配函数来申请的内存都是从堆上分配的,动态内存的生存期由程序员自己来决定从堆上分配的

29、,动态内存的生存期由程序员自己来决定从堆上分配的,动态内存的生存期由程序员自己来决定从堆上分配的,动态内存的生存期由程序员自己来决定 2024/4/2435/4211.4.2动态内存分配函数动态内存分配函数 Two primary methods of allocating memory:Two primary methods of allocating memory:void*void*malloc(unsigned int size);void*void*calloc(unsigned int num,unsigned int size);#includeinclude#includein

30、clude void*void*类型的指针可以指向任意类型的变类型的指针可以指向任意类型的变量,通常强转量,通常强转(Type*)(Type*)为其他类型为其他类型2024/4/2436/4211.4.2动态内存分配函数动态内存分配函数 Two primary methods of allocating memory:Two primary methods of allocating memory:void*malloc(unsigned int size);void*calloc(unsigned int num,unsigned int size);向系统申请大小为向系统申请大小为size

31、size的内存块的内存块把首地址返回,若申请不成功则返回把首地址返回,若申请不成功则返回NULLNULL向系统申请向系统申请num个个size大小的内存块大小的内存块把首地址返回,若申请不成功则返回把首地址返回,若申请不成功则返回NULL2024/4/2437/4211.4.2动态内存分配函数动态内存分配函数voidvoid*free(free(voidvoid*p);*p);释放由释放由malloc()和和calloc()申请的内存块申请的内存块p是指向此块内存的指针是指向此块内存的指针free时系统标记此块内存为未占用,可被重新分配时系统标记此块内存为未占用,可被重新分配Method of

32、 deallocating memory:2024/4/2438/42p pn n确保指针使用前是非空指针确保指针使用前是非空指针释放向系统申请的存储空间释放向系统申请的存储空间 11.4.3【例例11.6】一维动态数组一维动态数组2024/4/2439/42p pn n像使用一维数组一样像使用一维数组一样使用动态数组使用动态数组11.4.311.4.3【例例例例11.611.6】一维动态数组一维动态数组一维动态数组一维动态数组2024/4/2440/42确保指针使用前是确保指针使用前是非空指针非空指针释放向系统申请的释放向系统申请的存储空间存储空间 p pm*nm*n11.4.411.4.4

33、【例例例例11.711.7】二维动态数组二维动态数组二维动态数组二维动态数组2024/4/2441/42仍当作一维数组仍当作一维数组来使用来使用 p pm*nm*n11.4.411.4.4【例例例例11.711.7】二维动态数组二维动态数组二维动态数组二维动态数组 结束语当你尽了自己的最大努力时,失败也是伟大的,所以不要放弃,坚持就是正确的。When You Do Your Best,Failure Is Great,So DonT Give Up,Stick To The End谢谢大家荣幸这一路,与你同行ItS An Honor To Walk With You All The Way演讲人:XXXXXX 时 间:XX年XX月XX日

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

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

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


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