1、指针,第八章,2,回顾,数组的存储机制 数组的定义和使用 数组的初始化 二维和多维数组,3,目标,理解指针的意义 掌握指针变量和指针运算符的使用 掌握指针与数组的关系 掌握内存分配,4,什么是指针?,指针是一个变量,它包含另一个变量的内存地址 使用指针可以间接访问数据项的值 指针可以指向基本数据类型的变量(如 int、char和double等) 或者数组,5,指针可以用来做什么?,从函数中返回多个值 从一个函数向另一个函数传递数组和字符串 通过移动指针操作数组 分配内存并对其进行访问,6,指针变量,指针声明包括类型和变量名,变量名的前面有一个 *type *name;例如:int *var2;
2、,7,指针运算符,8,给指针赋值 2-1,通过 ,9,给指针赋值 2-2,通过指针为变量赋值*ptr_var = 10;如果ptr_var指向var,则把10赋给var,10,指针运算 2-1,只能进行加法和减法运算int var, *ptr_var;ptr_var = 假定var存储在地址1000中,因为整数的长度是 2 个字节,ptr_var的值将是1002,11,指针运算 2-2,指针递增时,将指向其类型的下一个元素的内存位置,反之亦然,12,指针比较,前提:两个指针都指向相同类型的变量假设ptr_a和ptr_b分别指向a和b,13,指针与一维数组 3-1,数组元素的地址可以用两种方式表
3、示 在数组元素前面加“&”符号&ary2数组名 + 下标ary + 2,14,指针与一维数组 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(“ ,值,地址,15,指针与一维数组 3-3,演示: 执行程序,观察并分析输出结果,16,指针与多维数组,二维数组可以定义为一个指向一组连续的一维数组的指针data_type (*p
4、tr_var) expr;,17,指针与字符串 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 c
5、haracter is at: %u“,ptr);printf(“nPosition of first occurrence is: %d”,ptr-str); ,指针运算,18,指针与字符串 2-2,演示: 执行程序,观察并分析输出结果,19,分配内存 2-1,malloc() 是最常用的函数之一 它允许从空闲内存池中分配内存 malloc() 的参数是代表所需字节数的整数,20,分配内存 2-2,#include #include void main() int *p,n,i,j,temp;printf(“n Enter number of elements in the array: “
6、);scanf(“%d“, ,分配内存,排序,21,free()函数 3-1,使用 free() 函数释放不再需要的内存void free(void *ptr);ptr 必须是通过malloc()、calloc()或realloc()分配的指针,22,free()函数 3-2,#include #include int main() int number;int *ptr;int i;printf(“How many ints?“);scanf(“%d“, ,for(i=number ; i0 ; i-) printf(“%dn“,*(ptr+(i-1);free(ptr);return 0;
7、 elseprintf(“nMemory allocation failed.n“);return 1; ,定义,分配,判断,释放,23,free()函数 3-3,演示: 执行程序,观察并分析输出结果,24,calloc()函数 3-1,calloc()与malloc()类似 主要的区别是存储在已分配的内存空间中的值默认为零 calloc()需要两个参数 要分配内存的变量的个数 每个变量的大小void *calloc( size_t num, size_t size );,25,calloc()函数 3-2,#include #include int main() float *calloc1
8、, *calloc2;int i;calloc1 = (float *) calloc(3, sizeof(float);calloc2 = (float *)calloc(3, sizeof(float);if(calloc1!=NULL ,定义,分配,判断,释放,26,calloc()函数 3-3,演示: 执行程序,观察并分析输出结果,27,realloc()函数 3-1,为已经分配的内存重新分配空间并复制内容realloc()函数有两个参数已分配的内存地址重新分配的字节数void *realloc( void *ptr, size_t size );,28,realloc()函数 3-2
9、,#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; ,定义,分配,判断,释放,再分配,29,realloc()函数 3-3,演示: 执行程序,观察并分析输出结果,30,总结,如何使用指针变量和指针运算符 指针赋值 指针运算 指针比较 指针与数组 内存分配,