C语言之指针.ppt
Version 3.0指针指针第八章第八章回顾回顾数组的存储机制数组的存储机制数组的定义和使用数组的定义和使用数组的初始化数组的初始化二维和多维数组二维和多维数组2 2目标目标理解指针的意义理解指针的意义掌握指针变量和指针运算符的使用掌握指针变量和指针运算符的使用掌握指针与数组的关系掌握指针与数组的关系掌握内存分配掌握内存分配3 3什么是指针?什么是指针?指针是一个变量,它包含另一个变量的内存指针是一个变量,它包含另一个变量的内存地址地址使用指针可以间接访问数据项的值使用指针可以间接访问数据项的值指针可以指向基本数据类型的变量(如指针可以指向基本数据类型的变量(如 int、char和和double等)等)或者数组或者数组4 4指针可以用来做什么?指针可以用来做什么?从函数中返回多个值从函数中返回多个值从一个函数向另一个函数传递数组和字符串从一个函数向另一个函数传递数组和字符串通过移动指针操作数组通过移动指针操作数组分配内存并对其进行访问分配内存并对其进行访问5 5指针变量指针变量指针声明包括类型和变量名,变量名的前指针声明包括类型和变量名,变量名的前面有一个面有一个*type*name;例如:例如:int*var2;var26 6指针运算符指针运算符&是一元运算符,它返回操作数的内存地址是一元运算符,它返回操作数的内存地址var2=&var1;*是是&的反运算符,它也是一元运算符,返的反运算符,它也是一元运算符,返回指针指向的内存位置中的值回指针指向的内存位置中的值temp=*var2;7 7给指针赋值给指针赋值 2-1通过通过&运算符为指针赋值运算符为指针赋值ptr_var=&var;通过另一个指向相同类型数据项的指针变通过另一个指向相同类型数据项的指针变量对指针进行赋值量对指针进行赋值ptr_var2=ptr_var;8 8给指针赋值给指针赋值 2-2通过指针为变量赋值通过指针为变量赋值*ptr_var=10;如果如果ptr_var指向指向var,则把,则把10赋给赋给var9 9指针运算指针运算 2-1只能进行加法和减法运算只能进行加法和减法运算int var,*ptr_var;ptr_var=&var;ptr_var+;假定假定var存储在地址存储在地址1000中,因为整数的长度中,因为整数的长度是是 2 个字节,个字节,ptr_var的值将是的值将是10021010指针运算指针运算 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 后面的下一个整数的后面的下一个整数的值值1111指针比较指针比较前提:两个指针都指向相同类型的变量前提:两个指针都指向相同类型的变量假设假设ptr_a和和ptr_b分别指向分别指向a和和b操作操作意义意义ptr_a ptr_b如果如果a存储在存储在b的前面则返回的前面则返回trueptr_a=ptr_b如果如果a存储在存储在b的前面,或两个指针指向同一的前面,或两个指针指向同一位置则返回位置则返回trueptr_a=ptr_b如果两个指针指向同一位置则返回如果两个指针指向同一位置则返回trueptr_a!=ptr_b如果两个指针指向不同位置则返回如果两个指针指向不同位置则返回trueptr_a=NULL如果如果ptr_a是空值则返回是空值则返回true1212指针与一维数组指针与一维数组 3-1数组元素的地址可以用两种方式表示数组元素的地址可以用两种方式表示在数组元素前面加“&”符号&ary2数组名+下标ary+21313指针与一维数组指针与一维数组 3-2#include void main()static int ary10=1,2,3,4,5,6,7,8,9,10;int i;for(i=0;i 10;i+)printf(ni=%d,aryi=%d,*(ary+i)=%d,i,aryi,*(ary+i);printf(&aryi=%X,ary+i=%X,&aryi,ary+i);值值地址地址1414指针与一维数组指针与一维数组 3-3演示:演示:执行程序,观察并分析输出结果执行程序,观察并分析输出结果1515指针与多维数组指针与多维数组 二维数组可以定义为一个指向一组连续的二维数组可以定义为一个指向一组连续的一维数组的指针一维数组的指针data_type (*ptr_var)expr;1616指针与字符串指针与字符串 2-1#include#include void main()char a,str81,*ptr;printf(nEnter a sentence:);gets(str);printf(nEnter character to search for:);a=getche();ptr=strchr(str,a);/*return pointer to char*/printf(nString starts at address:%u,str);printf(nFirst occurrence of the character is at:%u,ptr);printf(“nPosition of first occurrence is:%d”,ptr-str);指针运算指针运算1717指针与字符串指针与字符串 2-2演示:演示:执行程序,观察并分析输出结果执行程序,观察并分析输出结果1818分配内存分配内存 2-1malloc()是最常用的函数之一是最常用的函数之一它允许从空闲内存池中分配内存它允许从空闲内存池中分配内存malloc()的参数是代表所需字节数的整数的参数是代表所需字节数的整数1919分配内存分配内存 2-2#include#include void main()int*p,n,i,j,temp;printf(n Enter number of elements in the array:);scanf(%d,&n);p=(int*)malloc(n*sizeof(int);for(i=0;in;+i)printf(n Enter element no.%d:,i+1);scanf(%d,p+i);for(i=0;in-1;+i)for(j=i+1;j*(p+j)temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;for(i=0;in;+i)printf(%dn,*(p+i);分配内存分配内存排序排序2020free()函数函数 3-1使用使用 free()函数释放不再需要的内存函数释放不再需要的内存void free(void*ptr);ptr 必须是通过必须是通过malloc()、calloc()或或realloc()分配分配的指针的指针2121free()函数函数 3-2#include#include int main()int number;int*ptr;int i;printf(How many ints?);scanf(%d,&number);ptr=(int*)malloc(number*sizeof(int);if(ptr!=NULL)for(i=0;i0;i-)printf(%dn,*(ptr+(i-1);free(ptr);return 0;else printf(nMemory allocation failed.n);return 1;定义定义分配分配判断判断释放释放2222free()函数函数 3-3演示:演示:执行程序,观察并分析输出结果执行程序,观察并分析输出结果2323calloc()函数函数 3-1calloc()与与malloc()类似类似主要的区别是存储在已分配的内存空间中主要的区别是存储在已分配的内存空间中的值默认为零的值默认为零calloc()需要两个参数需要两个参数要分配内存的变量的个数每个变量的大小void*calloc(size_t num,size_t size);2424calloc()函数函数 3-2#include#include int main()float*calloc1,*calloc2;int i;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,calloc1i);printf(ncalloc2%d holds%05.5f,i,*(calloc2+i);free(calloc1);free(calloc2);return 0;else printf(Not enough memory n);return 1;定义定义分配分配判断判断释放释放2525calloc()函数函数 3-3演示:演示:执行程序,观察并分析输出结果执行程序,观察并分析输出结果2626realloc()函数函数 3-1为已经分配的内存重新分配空间并复制内容为已经分配的内存重新分配空间并复制内容 realloc()函数有两个参数函数有两个参数 已分配的内存地址 重新分配的字节数void*realloc(void*ptr,size_t size);2727realloc()函数函数 3-2#include#include int main()int*ptr;int i;ptr=(int*)calloc(5,sizeof(int*);if(ptr!=NULL)*ptr=1;*(ptr+1)=2;ptr2=4;ptr3=8;ptr4=16;ptr=(int*)realloc(ptr,7*sizeof(int);if(ptr!=NULL)ptr5=32;ptr6=64;for(i=0;i7;i+)printf(“ptr%d:%dn,i,ptri);realloc(ptr,0);/*free(ptr);*/return 0;定义定义分配分配判断判断释放释放再分配再分配2828realloc()函数函数 3-3演示:演示:执行程序,观察并分析输出结果执行程序,观察并分析输出结果2929总结总结如何使用指针变量和指针运算符如何使用指针变量和指针运算符指针赋值指针赋值指针运算指针运算指针比较指针比较指针与数组指针与数组内存分配内存分配3030