Version3.0指针第八章2回顾•数组的存储机制•数组的定义和使用•数组的初始化•二维和多维数组3目标•理解指针的意义•掌握指针变量和指针运算符的使用•掌握指针与数组的关系•掌握内存分配4什么是指针?•指针是一个变量,它包含另一个变量的内存地址•使用指针可以间接访问数据项的值•指针可以指向基本数据类型的变量(如int、char和double等)或者数组5指针可以用来做什么?•从函数中返回多个值•从一个函数向另一个函数传递数组和字符串•通过移动指针操作数组•分配内存并对其进行访问6指针变量•指针声明包括类型和变量名,变量名的前面有一个*type*name;例如:int*var2;var27指针运算符•&是一元运算符,它返回操作数的内存地址var2=&var1;•*是&的反运算符,它也是一元运算符,返回指针指向的内存位置中的值temp=*var2;8给指针赋值2-1•通过&运算符为指针赋值ptr_var=&var;•通过另一个指向相同类型数据项的指针变量对指针进行赋值ptr_var2=ptr_var;9给指针赋值2-2•通过指针为变量赋值*ptr_var=10;如果ptr_var指向var,则把10赋给var10指针运算2-1•只能进行加法和减法运算intvar,*ptr_var;ptr_var=&var;ptr_var++;假定var存储在地址1000中,因为整数的长度是2个字节,ptr_var的值将是100211指针运算2-2•指针递增时,将指向其类型的下一个元素的内存位置,反之亦然操作意义++ptr_var或ptr_var++指向var后面的下一个整数--ptr_var或ptr_var--指向var前面的整数ptr_var+i指向var后面的第i个整数ptr_var-i指向var前面的第i个整数++(*ptr_var)或(*ptr_var)++将var的值加1*(ptr_var++)取出var后面的下一个整数的值12指针比较•前提:两个指针都指向相同类型的变量假设ptr_a和ptr_b分别指向a和b操作意义ptr_aptr_b如果a存储在b的前面则返回trueptr_a=ptr_b如果a存储在b的前面,或两个指针指向同一位置则返回trueptr_a==ptr_b如果两个指针指向同一位置则返回trueptr_a!=ptr_b如果两个指针指向不同位置则返回trueptr_a==NULL如果ptr_a是空值则返回true13指针与一维数组3-1•数组元素的地址可以用两种方式表示–在数组元素前面加“&”符号&ary[2]–数组名+下标ary+214指针与一维数组3-2#includestdio.hvoidmain(){staticintary[10]={1,2,3,4,5,6,7,8,9,10};inti;for(i=0;i10;i++){printf(\ni=%d,ary[i]=%d,*(ary+i)=%d,i,ary[i],*(ary+i));printf(&ary[i]=%X,ary+i=%X,&ary[i],ary+i);}}值地址15指针与一维数组3-3演示:执行程序,观察并分析输出结果16指针与多维数组•二维数组可以定义为一个指向一组连续的一维数组的指针data_type(*ptr_var)[expr];17指针与字符串2-1#includestdio.h#includestring.hvoidmain(){chara,str[81],*ptr;printf(\nEnterasentence:);gets(str);printf(\nEntercharactertosearchfor:);a=getche();ptr=strchr(str,a);/*returnpointertochar*/printf(\nStringstartsataddress:%u,str);printf(\nFirstoccurrenceofthecharacterisat:%u,ptr);printf(“\nPositionoffirstoccurrenceis:%d”,ptr-str);}指针运算18指针与字符串2-2演示:执行程序,观察并分析输出结果19分配内存2-1•malloc()是最常用的函数之一•它允许从空闲内存池中分配内存•malloc()的参数是代表所需字节数的整数20分配内存2-2#includestdio.h#includemalloc.hvoidmain(){int*p,n,i,j,temp;printf(\nEnternumberofelementsinthearray:);scanf(%d,&n);p=(int*)malloc(n*sizeof(int));for(i=0;in;++i){printf(\nEnterelementno.%d:,i+1);scanf(%d,p+i);}for(i=0;in-1;++i)for(j=i+1;jn;++j)if(*(p+i)*(p+j)){temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;}for(i=0;in;++i)printf(%d\n,*(p+i));}分配内存排序21free()函数3-1•使用free()函数释放不再需要的内存voidfree(void*ptr);ptr必须是通过malloc()、calloc()或realloc()分配的指针22free()函数3-2#includestdio.h#includestdlib.hintmain(){intnumber;int*ptr;inti;printf(Howmanyints?);scanf(%d,&number);ptr=(int*)malloc(number*sizeof(int));if(ptr!=NULL){for(i=0;inumber;i++){*(ptr+i)=i;}for(i=number;i0;i--){printf(%d\n,*(ptr+(i-1)));}free(ptr);return0;}else{printf(\nMemoryallocationfailed.\n);return1;}}定义分配判断释放23free()函数3-3演示:执行程序,观察并分析输出结果24calloc()函数3-1•calloc()与malloc()类似•主要的区别是存储在已分配的内存空间中的值默认为零•calloc()需要两个参数–要分配内存的变量的个数–每个变量的大小void*calloc(size_tnum,size_tsize);25calloc()函数3-2#includestdio.h#includestdlib.hintmain(){float*calloc1,*calloc2;inti;calloc1=(float*)calloc(3,sizeof(float));calloc2=(float*)calloc(3,sizeof(float));if(calloc1!=NULL&&calloc2!=NULL){for(i=0;i3;i++){printf(\ncalloc1[%d]holds%05.5f,i,calloc1[i]);printf(\ncalloc2[%d]holds%05.5f,i,*(calloc2+i));}free(calloc1);free(calloc2);return0;}else{printf(Notenoughmemory\n);return1;}}定义分配判断释放26calloc()函数3-3演示:执行程序,观察并分析输出结果27realloc()函数3-1•为已经分配的内存重新分配空间并复制内容•realloc()函数有两个参数–已分配的内存地址–重新分配的字节数void*realloc(void*ptr,size_tsize);28realloc()函数3-2#includestdio.h#includestdlib.hintmain(){int*ptr;inti;ptr=(int*)calloc(5,sizeof(int*));if(ptr!=NULL){*ptr=1;*(ptr+1)=2;ptr[2]=4;ptr[3]=8;ptr[4]=16;ptr=(int*)realloc(ptr,7*sizeof(int));if(ptr!=NULL){ptr[5]=32;ptr[6]=64;for(i=0;i7;i++){printf(“ptr[%d]:%d\n,i,ptr[i]);}realloc(ptr,0);/*free(ptr);*/return0;}定义分配判断释放再分配29realloc()函数3-3演示:执行程序,观察并分析输出结果30总结•如何使用指针变量和指针运算符•指针赋值•指针运算•指针比较•指针与数组•内存分配