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

上传人:hknru****knru 文档编号:240976882 上传时间:2024-05-22 格式:PPT 页数:42 大小:1.68MB
返回 下载 相关 举报
C语言程序设计第11章指针和数组课件_第1页
第1页 / 共42页
C语言程序设计第11章指针和数组课件_第2页
第2页 / 共42页
C语言程序设计第11章指针和数组课件_第3页
第3页 / 共42页
点击查看更多>>
资源描述
第第第第11111111章章章章 指针和数组指针和数组指针和数组指针和数组第11章 指针和数组2024/5/222/42本章学习内容本章学习内容本章学习内容本章学习内容 指针与一维数组间的关系,指针与二维指针与一维数组间的关系,指针与二维数组间的关系数组间的关系 向函数传递一维数组和二维数组向函数传递一维数组和二维数组 指针数组,命令行参数指针数组,命令行参数 动态数组,动态内存分配动态数组,动态内存分配本章学习内容 指针与一维数组间的关系,指针与二维数组间的2024/5/223/4211.1 11.1 指针和一维数组间的关系指针和一维数组间的关系指针和一维数组间的关系指针和一维数组间的关系 intint a4=1,2,3,4;a4=1,2,3,4;0 0 x0037b000 x0037b000a0a00 0 x0037b004x0037b0040 0 x0037b008x0037b0080 0 x0037b00Bx0037b00Ba a.1intint *pa=a;pa=a;papaintint *pa=&a0;pa=&a0;234a1a1a2a2a3a3数组名是一个常量指针数组名是一个常量指针数组名是一个常量指针数组名是一个常量指针不能修改该指针的指向不能修改该指针的指向不能修改该指针的指向不能修改该指针的指向指针可当数组名使用指针可当数组名使用指针可当数组名使用指针可当数组名使用11.1 指针和一维数组间的关系 int a4=12024/5/224/4211.1 11.1 指针和一维数组间的关系指针和一维数组间的关系指针和一维数组间的关系指针和一维数组间的关系 intint a4=1,2,3,4;a4=1,2,3,4;0 0 x0037b000 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*pa11.1 指针和一维数组间的关系 int a4=12024/5/225/4211.1 11.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+411.1 指针和一维数组间的关系 int a4=12024/5/226/4211.1 11.1 指针和一维数组间的关系指针和一维数组间的关系指针和一维数组间的关系指针和一维数组间的关系【例例例例11.111.111.111.1】演示数组元素的引用方法演示数组元素的引用方法演示数组元素的引用方法演示数组元素的引用方法 11.1 指针和一维数组间的关系【例11.1】演示数组元素2024/5/227/4211.1 11.1 指针和一维数组间的关系指针和一维数组间的关系指针和一维数组间的关系指针和一维数组间的关系【例例例例11.111.111.111.1】演示数组元素的引用方法演示数组元素的引用方法演示数组元素的引用方法演示数组元素的引用方法 11.1 指针和一维数组间的关系【例11.1】演示数组元素2024/5/228/4211.1 11.1 指针和一维数组间的关系指针和一维数组间的关系指针和一维数组间的关系指针和一维数组间的关系【例例例例11.211.211.211.2】演示数组和指针变量作函数参数演示数组和指针变量作函数参数演示数组和指针变量作函数参数演示数组和指针变量作函数参数 被调函数的形参声明为被调函数的形参声明为数组类型,用下标法访数组类型,用下标法访问数组元素问数组元素11.1 指针和一维数组间的关系【例11.2】演示数组和指2024/5/229/4211.1 11.1 指针和一维数组间的关系指针和一维数组间的关系指针和一维数组间的关系指针和一维数组间的关系【例例例例11.211.211.211.2】演示数组和指针变量作函数参数演示数组和指针变量作函数参数演示数组和指针变量作函数参数演示数组和指针变量作函数参数 被调函数的形参声明为被调函数的形参声明为指针指针类型类型,用指针法访,用指针法访问数组元素问数组元素11.1 指针和一维数组间的关系【例11.2】演示数组和指2024/5/2210/4211.1 11.1 指针和一维数组间的关系指针和一维数组间的关系指针和一维数组间的关系指针和一维数组间的关系【例例例例11.211.211.211.2】演示数组和指针变量作函数参数演示数组和指针变量作函数参数演示数组和指针变量作函数参数演示数组和指针变量作函数参数 在主函数中这样做没有在主函数中这样做没有多大的实际意义多大的实际意义11.1 指针和一维数组间的关系【例11.2】演示数组和指2024/5/2211/4211.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系 可将二维数组看作一维数组,其每个数组元素又是可将二维数组看作一维数组,其每个数组元素又是可将二维数组看作一维数组,其每个数组元素又是可将二维数组看作一维数组,其每个数组元素又是一个一维数组一个一维数组一个一维数组一个一维数组 按行顺序存放所有元素按行顺序存放所有元素按行顺序存放所有元素按行顺序存放所有元素a00a01a02a10a11a12a0a0a1a1a0+1a0+2&a0a000&a1a100&a11a1+1&a12&a01&a02 a00 a0a01a02a10 a1 a11a12 a a1+2shortshort a23;a aa a+1+111.2 指针和二维数组间的关系可将二维数组看作一维数组,其2024/5/2212/4211.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系a00a01a02a10a11a12 a00 a0a01a02a10 a1 a11a12 a shortshort a23;a aa a+1+1a 代表代表二二维数组的首地址,维数组的首地址,第第0 0行行的地址,的地址,行地址行地址行地址行地址a+i 代表代表第第i i行行的地址的地址但并非增加但并非增加i i个字节!个字节!11.2 指针和二维数组间的关系a00a112024/5/2213/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 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系a00a11a0a1&a002024/5/2214/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 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系a00a11a0a1&a002024/5/2215/42 二维数组的二维数组的二维数组的二维数组的行行行行指针指针指针指针int int(*p)3;p)3;p=a;p=a;/用行地址初始化用行地址初始化用行地址初始化用行地址初始化 逐行查找逐行查找逐行查找逐行查找-逐列查找逐列查找逐列查找逐列查找pshortshort a23;a00a01a02a10a11a12a12a aa+1a+111.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系二维数组的行指针pshort a23;a002024/5/2216/42 二维数组的二维数组的二维数组的二维数组的行行行行指针指针指针指针int int(*p)3;p)3;p=a;p=a;/用行地址初始化用行地址初始化用行地址初始化用行地址初始化 逐行查找逐行查找逐行查找逐行查找-逐列查找逐列查找逐列查找逐列查找pshortshort a23;a00a01a02a10a11a12a+1a+1a a11.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系二维数组的行指针pshort a23;a002024/5/2217/42 二维数组的二维数组的二维数组的二维数组的行行行行指针指针指针指针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););shortshort a23;a00a01a02a10a11a12pa aa+1a+111.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系二维数组的行指针short a23;a00a2024/5/2218/42 二维数组的二维数组的二维数组的二维数组的列列列列指针指针指针指针int int*p;p;p=p=*a;a;/用列地址初始化用列地址初始化用列地址初始化用列地址初始化 逐个查找逐个查找逐个查找逐个查找相对偏移量相对偏移量相对偏移量相对偏移量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 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系二维数组的列指针pshort a23;a002024/5/2219/42【例例例例11.311.311.311.3】输入一个输入一个输入一个输入一个3 3 3 3行行行行4 4 4 4列的列的列的列的二维数组,然后输出这个二维数组,然后输出这个二维数组,然后输出这个二维数组,然后输出这个二维数组的元素值二维数组的元素值二维数组的元素值二维数组的元素值 11.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系【例11.3】输入一个3行4列的二维数组,然后输出这个二维数2024/5/2220/42【例例例例11.311.311.311.3】输入一个输入一个输入一个输入一个3 3 3 3行行行行4 4 4 4列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输出这个二维数组的元素值出这个二维数组的元素值出这个二维数组的元素值出这个二维数组的元素值 11.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系形参声明为列数已知的形参声明为列数已知的二维数组二维数组【例11.3】输入一个3行4列的二维数组,然后输出这个二维数2024/5/2221/42【例例例例11.311.311.311.3】输入一个输入一个输入一个输入一个3 3 3 3行行行行4 4 4 4列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输出这个二维数组的元素值出这个二维数组的元素值出这个二维数组的元素值出这个二维数组的元素值 11.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系形参声明为指向列数已知形参声明为指向列数已知的二维数组的行指针的二维数组的行指针【例11.3】输入一个3行4列的二维数组,然后输出这个二维数2024/5/2222/42【例例例例11.311.311.311.3】输入一个输入一个输入一个输入一个3 3 3 3行行行行4 4 4 4列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输出这个二维数组的元素值出这个二维数组的元素值出这个二维数组的元素值出这个二维数组的元素值 11.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系形参声明为指向二维数组形参声明为指向二维数组的列指针的列指针【例11.3】输入一个3行4列的二维数组,然后输出这个二维数2024/5/2223/42【例例例例11.311.311.311.3】输入一个输入一个输入一个输入一个3 3 3 3行行行行4 4 4 4列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输列的二维数组,然后输出这个二维数组的元素值出这个二维数组的元素值出这个二维数组的元素值出这个二维数组的元素值 11.2 11.2 指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系指针和二维数组间的关系【例11.3】输入一个3行4列的二维数组,然后输出这个二维数2024/5/2224/42指针和数组作函数参数指针和数组作函数参数指针和数组作函数参数指针和数组作函数参数 通过指针或数组参数,使调用者获得修改后的通过指针或数组参数,使调用者获得修改后的通过指针或数组参数,使调用者获得修改后的通过指针或数组参数,使调用者获得修改后的数据数据数据数据 通过一个参数把大量的数据送到函数内通过一个参数把大量的数据送到函数内通过一个参数把大量的数据送到函数内通过一个参数把大量的数据送到函数内如果只向内传送数据,就把参数定义为如果只向内传送数据,就把参数定义为如果只向内传送数据,就把参数定义为如果只向内传送数据,就把参数定义为constconst,防,防,防,防止意外修改数据,也让函数的功能更明确止意外修改数据,也让函数的功能更明确止意外修改数据,也让函数的功能更明确止意外修改数据,也让函数的功能更明确 voidvoid PrintArray(PrintArray(constconst int*int*p,p,intint n)n).voidvoid PrintArray(PrintArray(constconst intint a,a,intint n)n).指针和数组作函数参数通过指针或数组参数,使调用者获得修改后的2024/5/2225/42指针、数组以及其他的类型混合指针、数组以及其他的类型混合指针、数组以及其他的类型混合指针、数组以及其他的类型混合 基本数据类型基本数据类型基本数据类型基本数据类型intint、longlong、charchar、shortshort、floatfloat、doubledouble 数组是一种数据类型数组是一种数据类型数组是一种数据类型数组是一种数据类型是从其他类型派生的类型是从其他类型派生的类型是从其他类型派生的类型是从其他类型派生的类型 每个元素都有一个类型每个元素都有一个类型每个元素都有一个类型每个元素都有一个类型 指针是一种数据类型指针是一种数据类型指针是一种数据类型指针是一种数据类型是从其他类型派生的类型是从其他类型派生的类型是从其他类型派生的类型是从其他类型派生的类型 XXXXXXXX类型的指针类型的指针类型的指针类型的指针 任何类型都可以作指针或者数组的任何类型都可以作指针或者数组的任何类型都可以作指针或者数组的任何类型都可以作指针或者数组的基类型基类型基类型基类型指针、数组以及其他的类型混合基本数据类型2024/5/2226/4211.311.3指针数组及其应用指针数组及其应用指针数组及其应用指针数组及其应用 用指针作数组的基类型用指针作数组的基类型用指针作数组的基类型用指针作数组的基类型?指针数组指针数组指针数组指针数组(Pointer ArrayPointer ArrayPointer ArrayPointer Array)元素均为指针类型数据的数组元素均为指针类型数据的数组元素均为指针类型数据的数组元素均为指针类型数据的数组 定义形式为:定义形式为:定义形式为:定义形式为:数据类型数据类型数据类型数据类型 *数组名数组名数组名数组名 数组长度数组长度数组长度数组长度;例如例如例如例如char*char*ptr5;ptr5;ptrptr55*charchar11.3指针数组及其应用用指针作数组的基类型?ptr52024/5/2227/42第第第第1010章章章章【例例例例10.410.4】国名国名国名国名字符串排序字符串排序字符串排序字符串排序二维数组二维数组二维数组二维数组charchar namenameNNMAX_LENMAX_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交换字符数组中的字符串交换字符数组中的字符串物理排序物理排序第10章【例10.4】国名字符串排序二维数组char n2024/5/2228/42【例例例例11.411.4】国名国名国名国名字符串排序字符串排序字符串排序字符串排序指针数组指针数组指针数组指针数组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)为指向每个参数的字符指针为指向每个参数的字符指针为指向每个参数的字符指针为指向每个参数的字符指针11.3.2指针数组用于表示命令行参数GUI界面之前,计算机2024/5/2232/42【例例例例11.511.5】演示命令行参数与演示命令行参数与演示命令行参数与演示命令行参数与mainmain函数各形参之间的关系函数各形参之间的关系函数各形参之间的关系函数各形参之间的关系 intint main(int argc,char*argv)main(int argc,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 arguments 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 other arguments are following:programming is funargv0echo.exeargv1argv2a2024/5/2234/4211.4.1 C11.4.1 C程序的内存映像程序的内存映像程序的内存映像程序的内存映像 C C程序中变量的内存分配方式程序中变量的内存分配方式 从静态存储区分配从静态存储区分配从静态存储区分配从静态存储区分配 全局变量和静态变量全局变量和静态变量全局变量和静态变量全局变量和静态变量 在栈上创建在栈上创建在栈上创建在栈上创建 存放函数参数值、局部变量值等存放函数参数值、局部变量值等存放函数参数值、局部变量值等存放函数参数值、局部变量值等 在执行函数调用时,系统在栈上为函数内的局部变量及形在执行函数调用时,系统在栈上为函数内的局部变量及形在执行函数调用时,系统在栈上为函数内的局部变量及形在执行函数调用时,系统在栈上为函数内的局部变量及形参分配内存,函数执行结束时,自动释放这些内存参分配内存,函数执行结束时,自动释放这些内存参分配内存,函数执行结束时,自动释放这些内存参分配内存,函数执行结束时,自动释放这些内存从堆上分配从堆上分配从堆上分配从堆上分配 在程序运行期间,用动态内存分配函数来申请的内存都是在程序运行期间,用动态内存分配函数来申请的内存都是在程序运行期间,用动态内存分配函数来申请的内存都是在程序运行期间,用动态内存分配函数来申请的内存都是从堆上分配的,动态内存的生存期由程序员自己来决定从堆上分配的,动态内存的生存期由程序员自己来决定从堆上分配的,动态内存的生存期由程序员自己来决定从堆上分配的,动态内存的生存期由程序员自己来决定 11.4.1 C程序的内存映像 C程序中变量的内存分配方式2024/5/2235/4211.4.211.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#includeinclude void*void*类型的指针可以指向任意类型的变类型的指针可以指向任意类型的变量,通常强转量,通常强转(Type*)(Type*)为其他类型为其他类型11.4.2动态内存分配函数Two primary meth2024/5/2236/4211.4.211.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);向系统申请大小为向系统申请大小为sizesize的内存块的内存块把首地址返回,若申请不成功则返回把首地址返回,若申请不成功则返回NULLNULL向系统申请向系统申请num个个size大小的内存块大小的内存块把首地址返回,若申请不成功则返回把首地址返回,若申请不成功则返回NULL11.4.2动态内存分配函数Two primary meth2024/5/2237/4211.4.211.4.2动态内存分配函数动态内存分配函数动态内存分配函数动态内存分配函数voidvoid*free(free(voidvoid*p);*p);释放由释放由malloc()和和calloc()申请的内存块申请的内存块p是指向此块内存的指针是指向此块内存的指针free时系统标记此块内存为未占用,可被重新分配时系统标记此块内存为未占用,可被重新分配Method of deallocating memory:11.4.2动态内存分配函数void*free(void*2024/5/2238/42p pn n确保指针使用前是非空指针确保指针使用前是非空指针释放向系统申请的存储空间释放向系统申请的存储空间 11.4.311.4.3【例例例例11.611.6】一维动态数组一维动态数组一维动态数组一维动态数组pn确保指针使用前是非空指针释放向系统申请的存储空间 11.2024/5/2239/42p pn n像使用一维数组一样像使用一维数组一样使用动态数组使用动态数组11.4.311.4.3【例例例例11.611.6】一维动态数组一维动态数组一维动态数组一维动态数组pn像使用一维数组一样11.4.3【例11.6】一维动态2024/5/2240/42确保指针使用前是确保指针使用前是非空指针非空指针释放向系统申请的释放向系统申请的存储空间存储空间 p pm*nm*n11.4.411.4.4【例例例例11.711.7】二维动态数组二维动态数组二维动态数组二维动态数组确保指针使用前是非空指针释放向系统申请的存储空间 2024/5/2241/42仍当作一维数组仍当作一维数组来使用来使用 p pm*nm*n11.4.411.4.4【例例例例11.711.7】二维动态数组二维动态数组二维动态数组二维动态数组仍当作一维数组来使用 pm*n11.4.4【例112024/5/2242/42 Questions and answersQuestions and answers
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


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

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


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