
指针指针数组、多级指针、动态指针.ppt
22页1数组指针——以此类推v一维数组名是“列指针类型”----“元素指针类型”指针变量的定义:int *p;v二维数组名是“行指针类型”指针变量的定义:int (*p)[4] ;v三维数组名是“页指针类型”指针变量的定义:int (*p)[3][4] ;v四维数组名是“块指针类型”指针变量的定义:int (*p)[3][4][5] ;圆括号是 必须的2问题的提出v变量是用于存放单个数据的v数组是用于存放“同类型”的多个数据的方便循环控制结构的编程v指针变量是用于存放单个地址号的v“同类型”的多个地址号是否能够集中存储在一 起构成“指针数组”呢?3v元素均为指针类型数据的数组,称为指针数组 v定义形式为: 类型关键字 *数组名[数组长度];v例如char *pStr[5]; pStrpStr[5][5]* *charchar四、指针数组注意 没有 圆括号4例: 二维字符数组void main() {int i;char str[][10] = {“Pascal“,“Basic“,“Fortran“,“Java“,“Visual C“};for (i=0; i 1) { printf(“The other arguments are following:\n“); for (i = 1; ix[j])vj=i;vreturn(v}vvoid main()v{vint a[5]={3,6,1,9,12},*max;vmax=findMax(a);vprintf(“max[%d]=%d“,max-a,*max);v}12五、 多级指针和动态指针1.概念及定义v定义: 指向指针的指针v一级指针:指针变量中存放目标变量的地址p1int *p2;int i=3;p2=p1=**p1=5;二级指针:指针变量中存放一级指针变量的地址例 int *p; int i=3;p=*p=5;(2) 赋值p=pp= (3)引用方法 pp的值 *pp的值 **pp的值多级指针定义形式14动态分配内存152.动态指针v为什么要动态分配内存?当事先不知道所需要处理的数据有多大时, 使 用静态数组, 若数组开辟得太大, 则浪费内存资 源(甚至可能不成功); 若开辟得太小, 又不能 满足计算需要。
采用动态分配内存的方法,使用 完毕,再释放内存,以备其它程序使用C语言中提供了几个标准函数,以实现内存的 分配和释放16动态分配内存v#include v#include vvoid* malloc(unsigned int size);向系统申请大小为size的内存块,把首地址返回如果申请不成功 ,返回NULLvvoid* calloc(unsigned int num, unsigned int size);向系统申请num个size大小的内存块,把首地址返回如果申请不 成功,返回NULLvvoid free(void* p);释放由malloc()和calloc()申请的内存块p是指向此块的指针vvoid*类型的指针可以指向任意类型的变量17动态数组v一维动态数组int *p = NULL; printf(“Please enter array size:“); scanf(“%d“, p = (int *) malloc(n * sizeof (int));… p[i] //像使用一维数组一样使用 …v二维动态数组 printf(“Please enter array size m,n:“); scanf(“%d,%d“, p = (int *) calloc(m * n, sizeof (int)); … p[i*n+j]); //像使用一维数组一样使用 …18函数指针(选学)1.函数指针的概念一个函数在编译时,被分配了一个入口 地址,这个地址就称为该函数的指针。
可以用一个指针变量指向一个函数,然后通过 该指针变量调用此函数192.指向函数的指针变量 (1)定义格式函数类型 (*指针变量)( );注意:“*指针变量”外的括号不能缺,否则成了返回指针值 的函数例如,int (*fp)( ); /* fp为指向int函数的指针变量*/(2)赋值函数名代表该函数的入口地址因此,可用函数名给指向函数的指针变量赋值指向函数的指针变量=[ 注意:函数名后不能带括号和参数;函数名前的“ for ( i=0;iy; } int xiaoyu(int x,int y) { return x
