C语言哈尔滨大学2演示课件_第1页
C语言哈尔滨大学2演示课件_第2页
C语言哈尔滨大学2演示课件_第3页
C语言哈尔滨大学2演示课件_第4页
C语言哈尔滨大学2演示课件_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章 指针和数组,哈尔滨工业大学计算机科学与技术学院苏小红,本章学习内容, 指针与一维数组间的关系,指针与二维数组间的关系 向函数传递一维数组和二维数组 指针数组,命令行参数 动态数组,动态内存分配,11.1 指针和一维数组间的关系,int a4=1,2,3,4;,0x0037b000,a0,0x0037b004,0x0037b008,0x0037b00B,a,.,.,1,int *pa=a;,pa,int *pa=,2,3,4,a1,a2,a3,数组名是一个常量指针不能修改该指针的指向,指针可当数组名使用,11.1 指针和一维数组间的关系,int a4=1,2,3,4;,0x0037b000,a0,0x0037b004,0x0037b008,0x0037b00B,a,.,.,1,int *pa=a;,pa,int *pa=,2,3,4,a1,a2,a3,数组元素的等价引用形式ai*(a+i)pai*(pa+i),a+1,*(a+1),pa0,*(pa+2),pa+2,*pa,11.1 指针和一维数组间的关系,int a4=1,2,3,4;,0x0037b000,a0,0x0037b004,0x0037b008,0x0037b00B,a,.,.,1,p,2,3,4,a1,a2,a3,for (i=0; i4; i+) scanf(%d, ,for (p=a; p(a+4); p+) scanf(%d, p); for (p=a; p(a+4); p+) printf(%d , *p);,*p,*p,a+4,11.1 指针和一维数组间的关系,【例11.1】演示数组元素的引用方法,11.1 指针和一维数组间的关系,【例11.1】演示数组元素的引用方法,11.1 指针和一维数组间的关系,【例11.2】演示数组和指针变量作函数参数,被调函数的形参声明为数组类型,用下标法访问数组元素,11.1 指针和一维数组间的关系,【例11.2】演示数组和指针变量作函数参数,被调函数的形参声明为指针类型,用指针法访问数组元素,11.1 指针和一维数组间的关系,【例11.2】演示数组和指针变量作函数参数,在主函数中这样做没有多大的实际意义,11.2 指针和二维数组间的关系,可将二维数组看作一维数组,其每个数组元素又是一个一维数组按行顺序存放所有元素,a0,a1,a0+1,a0+2,&a00,&a10,&a11,a1+1,&a12,&a01,&a02,a1+2,short a23;,a,a+1,11.2 指针和二维数组间的关系,short a23;,a,a+1,a 代表二维数组的首地址,第0行的地址,行地址,a + i 代表第i行的地址但并非增加i个字节!,a0,a1,&a00,&a10,short a23;,*(a + i) 即 ai 代表第i行第0列的地址,列地址,a,a+1,*(a+i) + j 即 ai + j代表第i行第j列的地址&aij,&a12,a1+2,11.2 指针和二维数组间的关系,a0,a1,&a00,&a10,short a23;,a,a+1,&a12,a1+2,*( *(a+i) + j ) 即 aij 代表第i行第j列的内容,*(a + i) 即 ai 代表第i行第0列的地址,列地址,*(a+i) + j 即 ai + j代表第i行第j列的地址&aij,11.2 指针和二维数组间的关系,二维数组的行指针int (*p)3;p = a; /用行地址初始化逐行查找-逐列查找,short a23;,a,a+1,11.2 指针和二维数组间的关系,二维数组的行指针int (*p)3;p = a; /用行地址初始化逐行查找-逐列查找,short a23;,a+1,a,11.2 指针和二维数组间的关系,二维数组的行指针int (*p)3;p = a; /用行地址初始化逐行查找-逐列查找for (i=0; im; i+)for (j=0; jn; j+) printf(%d,*(*(p+i)+j);,short a23;,a,a+1,11.2 指针和二维数组间的关系,二维数组的列指针int *p;p = *a; /用列地址初始化逐个查找相对偏移量for (i=0; im; i+)for (j=0; jn; j+) printf(%d,*(p+i*n+j);,short a23;,*a或a0,pi*n+j,11.2 指针和二维数组间的关系,【例11.3】输入一个3行4列的二维数组,然后输出这个二维数组的元素值,11.2 指针和二维数组间的关系,【例11.3】输入一个3行4列的二维数组,然后输出这个二维数组的元素值,11.2 指针和二维数组间的关系,形参声明为列数已知的二维数组,【例11.3】输入一个3行4列的二维数组,然后输出这个二维数组的元素值,11.2 指针和二维数组间的关系,形参声明为指向列数已知的二维数组的行指针,【例11.3】输入一个3行4列的二维数组,然后输出这个二维数组的元素值,11.2 指针和二维数组间的关系,形参声明为指向二维数组的列指针,【例11.3】输入一个3行4列的二维数组,然后输出这个二维数组的元素值,11.2 指针和二维数组间的关系,指针和数组作函数参数,通过指针或数组参数,使调用者获得修改后的数据通过一个参数把大量的数据送到函数内如果只向内传送数据,就把参数定义为const,防止意外修改数据,也让函数的功能更明确void PrintArray(const int *p, int n).void PrintArray(const int a, int n).,指针、数组以及其他的类型混合,基本数据类型int、long、char、short、float、double数组是一种数据类型是从其他类型派生的类型每个元素都有一个类型指针是一种数据类型是从其他类型派生的类型XX类型的指针任何类型都可以作指针或者数组的基类型,11.3指针数组及其应用,用指针作数组的基类型?指针数组(Pointer Array)元素均为指针类型数据的数组定义形式为: 数据类型 *数组名数组长度;例如char *ptr5;,ptr,5,*,char,第10章【例10.4】国名字符串排序二维数组,char nameNMAX_LEN; .for (i=0; in-1; i+) for (j = i+1; jn; j+) if(strcmp(strj,stri)0) strcpy(temp,stri); strcpy(stri,strj); strcpy(strj,temp); ,MAX_LEN,N,物理排序,【例11.4】国名字符串排序指针数组,char *ptrN;.for (i=0; in-1; i+) for (j = i+1; jn; j+) if(strcmp(ptrj,ptri)1)为指向每个参数的字符指针,【例11.5】演示命令行参数与main函数各形参之间的关系,int main(int argc, char *argv)int i; printf(The number of command line arguments is:%dn,argc);printf(The program name is:%sn, argv0);if (argc 1)printf(The other arguments are following:n);for (i = 1; i 1)printf(The other arguments are following:n);for (i = 1; iargc; i+) printf(%sn, argvi); return 0;,The number of command line arguments is: 4The program name is: echo.exeThe other arguments are following: programming is fun,11.4.1 C程序的内存映像,C程序中变量的内存分配方式 从静态存储区分配全局变量和静态变量 在栈上创建 存放函数参数值、局部变量值等在执行函数调用时,系统在栈上为函数内的局部变量及形参分配内存,函数执行结束时,自动释放这些内存从堆上分配 在程序运行期间,用动态内存分配函数来申请的内存都是从堆上分配的,动态内存的生存期由程序员自己来决定,11.4.2动态内存分配函数,Two primary methods of allocating memory:,void* malloc(unsigned int size);,void* calloc(unsigned int num, unsigned int size);,#include #include ,void*类型的指针可以指向任意类型的变量,通常强转(Type*)为其他类型,11.4.2动态内存分配函数,Two primary methods of allocating memory:,void* malloc(unsigned int size);,void* calloc(unsigned int num, unsigned int size);,向系统申请大小为size的内存块把首地址返回,若申请不成功则返回NULL,向系统申请num个size大小的内存块把首地址返回,若申请不成功则返回NULL,11.4.2动态内存分配函数,void* free(void* p);,释放由malloc()和calloc()申请的内存块p是指向此块内存的指针free时系统标记此块内存为未占用,可被重新分配,Me

温馨提示

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

评论

0/150

提交评论