new第8章善于利用指针.ppt

上传人:小飞机 文档编号:5441358 上传时间:2023-07-07 格式:PPT 页数:142 大小:1,015KB
返回 下载 相关 举报
new第8章善于利用指针.ppt_第1页
第1页 / 共142页
new第8章善于利用指针.ppt_第2页
第2页 / 共142页
new第8章善于利用指针.ppt_第3页
第3页 / 共142页
new第8章善于利用指针.ppt_第4页
第4页 / 共142页
new第8章善于利用指针.ppt_第5页
第5页 / 共142页
点击查看更多>>
资源描述

《new第8章善于利用指针.ppt》由会员分享,可在线阅读,更多相关《new第8章善于利用指针.ppt(142页珍藏版)》请在三一办公上搜索。

1、第8章 善于利用指针,8.1 指针是什么8.2 指针变量8.3 通过指针引用数组8.4 通过指针引用字符串8.5 指向函数的指针8.6 返回指针值的函数8.7 指针数组和多重指针8.8 动态内存分配与指向它的指针变量8.9 有关指针的小结,8.1 指針是什么,如果在程序中定义了一个变量,在对程序进行编译时,系统就会给该变量分配内存单元编译系统根据程序中定义变量时指定的类型,分配一定长度的空间。例如,VC+为整型变量分配4个字节,对单精度浮点型变量分配个字节,对字符型变量分配个字节,8.1 指针是什么,内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。在地址所标识的内存单元中

2、存放数据,这相当于旅馆房间中居住的旅客一样。由于通过地址能找到所需的变量单元,我们可以说,地址指向该变量单元。将地址形象化地称为“指针”,“指针”和“指针变量”是不同的概念指针是一个地址,而指针变量是存放地址的变量,8.2 指针变量,使用指针变量的例子8.2.2 怎样定义指针变量8.2.3 怎样引用指针变量8.2.4 指针变量作为函数参数,使用指针变量的例子,例8.1 通过指针变量访问整型变量。解题思路:先定义2个整型变量,再定义2个指针变量,分别指向这两个整型变量,通过访问指针变量,可以找到它们所指向的变量,从而得到这些变量的值。,#include int main()int a=100,b

3、=10;int*pointer_1,*pointer_2;pointer_1=,定义两个指针变量,使pointer_1指向a,使pointer_2指向b,直接输出变量a和b的值,间接输出变量a和b的值,#include int main()int a=100,b=10;int*pointer_1,*pointer_2;pointer_1=,此处*与类型名在一起。此时共同定义指针变量,此处*与指针变量一起使用。此时代表指针变量所指向的变量,8.2.2 怎样定义指针变量,定义指针变量的一般形式为:类型*指针变量名;如:int*pointer_1,*pointer_2;int是为指针变量指定的“基类

4、型”基类型指定指针变量可指向的变量类型如pointer_1可以指向整型变量,但不能指向浮点型变量,8.2.2 怎样定义指针变量,下面都是合法的定义和初始化:float*pointer_3;char*pointer_4;int a,b;int*pointer_1=,*pointer_1 错误,pointer_3 错误,pointer_1 正确,pointer_32000;错误,8.2.3 怎样引用指针变量,要熟练掌握两个有关的运算符:(1)取地址运算符。(把1赋给a),例8.2 输入a和b两个整数,按先大后小的顺序输出a和b。解题思路:用指针方法来处理这个问题。不交换整型变量的值,而是交换两个指

5、针变量的值。,#include int main()int*p1,*p2,*p,a,b;printf(“integer numbers:);scanf(“%d,%d”,a,b,p1,p2,p,5,9,&a,&b,成立,#include int main()int*p1,*p2,*p,a,b;printf(“integer numbers:);scanf(“%d,%d”,a,b,p1,p2,p,5,9,&a,&b,&b,&a,#include int main()int*p1,*p2,*p,a,b;printf(“integer numbers:);scanf(“%d,%d”,a,b,p1,p2

6、,p,5,9,&a,&b,&b,&a,#include int main()int*p1,*p2,*p,a,b;printf(“integer numbers:);scanf(“%d,%d”,a,b,p1,p2,p,5,9,&a,&b,&b,&a,可否改为p1=?,注意:a和b的值并未交换,它们仍保持原值但p1和p2的值改变了。p1的值原为&a,后来变成&b,p2原值为&b,后来变成&a这样在输出*p1和*p2时,实际上是输出变量b和a的值,所以先输出9,然后输出5,8.2.4 指针变量作为函数参数,例8.3 题目要求同例8.2,即对输入的两个整数按大小顺序输出。现用函数处理,而且用指针类型的

7、数据作函数参数。解题思路:定义一个函数swap,将指向两个整型变量的指针变量作为实参传递给swap函数的形参指针变量,在函数中通过指针实现交换两个变量的值。,#include int main()void swap(int*p1,int*p2);int a,b;int*pointer_1,*pointer_2;printf(please enter a and b:);scanf(“%d,%d”,a,b,pointer_1,5,9,&a,&b,pointer_2,void swap(int*p1,int*p2)int temp;temp=*p1;*p1=*p2;*p2=temp;,a,b,po

8、inter_1,5,9,&a,&b,pointer_2,p1,&a,p2,&b,9,5,#include int main()if(ab)swap(a,b);printf(“max=%d,min=%dn”,a,b);return 0;void swap(int x,int y)int temp;temp=x;x=y;y=temp;,错!无法交换a,b,a,b,5,9,x,y,5,9,9,5,8.3通过指针引用数组,8.3.1 数组元素的指针8.3.2 在引用数组元素时指针的运算8.3.3 通过指针引用数组元素8.3.4 用数组名作函数参数8.3.5 通过指针引用多维数组,8.3.1 数组元素的

9、指针,一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中)所谓数组元素的指针就是数组元素的地址,可以用一个指针变量指向一个数组元素 int a10=1,3,5,7,9,11,13,15,17,19;int*p;p=,等价于p=a;,等价于int*p=a;或int*p=,注意:数组名a不代表整个数组,只代表数组首元素的地址。“p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”,而不是“把数组a各元素的值赋给p”。,8.3.2 在引用数组元素时指针的运算,在指针指向数组元素时,允许以下运算:加一个整数(用+或+=),

10、如p+1减一个整数(用-或-=),如p-1自加运算,如p+,+p自减运算,如p-,-p两个指针相减,如p1-p2(只有p1和p2都指向同一数组中的元素时才有意义),(1)如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。float a10,*p=a;假设a0的地址为2000,则p的值为2000p+1的值为2004P-1的值为1996,越界,(2)如果的初值为&a0,则p+i和a+i就是数组元素ai的地址,或者说,它们指向a数组序号为i的元素,p,p+1,a+1,p+i,a+i,p+9,a+9,(3)*(p+i)或*(a+i)是p+i或a

11、+i所指向的数组元素,即ai。,p,p+1,a+1,p+i,a+i,p+9,a+9,*(p+i),(4)如果指针p1和p2都指向同一数组 p2-p1的值是4 不能p1+p2,p1,p2,8.3.3 通过指针引用数组元素,引用一个数组元素,可用下面两种方法:()下标法,如ai形式()指针法,如*(a+i)或*(p+i)其中a是数组名,p是指向数组元素的指针变量,其初值p=a,8.3.3 通过指针引用数组元素,例8.6 有一个整型数组a,有10个元素,要求输出数组中的全部元素。解题思路:引用数组中各元素的值有3种方法:(1)下标法;(2)通过数组名计算数组元素地址,找出元素的值;(3)用指针变量指

12、向数组元素分别写出程序,以资比较分析。,(1)下标法。#include int main()int a10;int i;printf(“enter 10 integer numbers:n);for(i=0;i10;i+)scanf(%d,(2)通过数组名计算数组元素地址,找出元素的值#include int main()int a10;int i;printf(“enter 10 integer numbers:n);for(i=0;i10;i+)scanf(%d,a+i);for(i=0;i10;i+)printf(“%d”,*(a+i);printf(n);return 0;,(3)用指

13、针变量指向数组元素#include int main()int a10;int*p,i;printf(“enter 10 integer numbers:n);for(p=a;p(a+10);p+)scanf(%d,p);for(p=a;p(a+10);p+)printf(“%d”,*p);printf(n);return 0;,8.3.4 用数组名作函数参数,用数组名作函数参数时,因为实参数组名代表该数组首元素的地址,形参应该是一个指针变量C编译都是将形参数组名作为指针变量来处理的,int main()void fun(int arr,int n;int array10;fun(array,

14、10);return 0;void fun(int arr,int n),fun(int*arr,int n),int main()void fun(int arr,int n;int array10;fun(array,10);return 0;void fun(int*arr,int n),array0,arr0,array数组,arr,array3,arr3,arr+3,实参数组名是指针常量,但形参数组名是按指针变量处理在函数调用进行形实结合后,它的值就是实参数组首元素的地址在函数执行期间,形参数组可以再被赋值void fun(int arr,int n)printf(%dn,*arr)

15、;arr=arr+3;printf(%dn,*arr);,例8.8 将数组a中n个整数按相反顺序存放解题思路:将a0与an-1对换,将a4与a5对换。,j,i,例8.8 将数组a中n个整数按相反顺序存放解题思路:将a0与an-1对换,将a4与a5对换。,j,i,例8.8 将数组a中n个整数按相反顺序存放解题思路:将a0与an-1对换,将a4与a5对换。,j,i,例8.8 将数组a中n个整数按相反顺序存放解题思路:将a0与an-1对换,将a4与a5对换。,j,i,例8.8 将数组a中n个整数按相反顺序存放解题思路:将a0与an-1对换,将a4与a5对换。,j,i,#include int mai

16、n()void inv(int x,int n);int i,a10=3,7,9,11,0,6,7,5,4,2;for(i=0;i10;i+)printf(“%d”,ai);printf(n);inv(a,10);for(i=0;i10;i+)printf(“%d”,ai);printf(n);return 0;,void inv(int x,int n)int temp,i,j;j=n-1;for(i=0;ij;i+,j-)temp=xi;xi=xj;xj=temp;,例8.9 改写例8.8,用指针变量作实参。,#include int main()void inv(int*x,int n)

17、;int i,arr10,*p=arr;for(i=0;i10;i+,p+)scanf(“%d”,p);inv(p,10);for(p=arr;parr+10;p+)printf(“%d”,*p);printf(n);return 0;,不可少!,void inv(int*x,int n)int temp,i,j;j=n-1;for(i=0;ij;i+,j-)temp=*(x+i);*(x+i)=*(x+j);*(x+j)=temp;,例8.10 用指针方法对10个整数按由大到小顺序排序。解题思路:在主函数中定义数组a存放10个整数,定义int*型指针变量p指向a0定义函数sort使数组a中的

18、元素按由大到小的顺序排列在主函数中调用sort函数,用指针p作实参用选择法进行排序,#include int main()void sort(int x,int n);int i,*p,a10;p=a;for(i=0;i10;i+)scanf(“%d”,p+);p=a;sort(p,10);for(p=a,i=0;i10;i+)printf(“%d”,*p);p+;printf(n);return 0;,void sort(int x,int n)int i,j,k,t;for(i=0;ixk)k=j;if(k!=i)t=xi;xi=xk;xk=t;,void sort(int*x,int n

19、),if(*(x+j)*(x+k)k=j;,t=*(x+i);*(x+i)=*(x+k);*(x+k)=t;,8.3.5 通过指针引用多维数组,指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用方法上,多维数组的指针比一维数组的指针要复杂一些。,8.3.5 通过指针引用多维数组,1.多维数组元素的地址int a34=1,3,5,7,9,11,13,15,17,19,21,23;,a,a+1,a+2,a0,a0+1,a0+2,a0+3,行指针,列指针,a代表第0行首地址a+1代表第1行首地址a+2代表第2行首地址,a,a+1,a+2,a0,a0+1,a0+2,a0+3

20、,行指针,列指针,行指针每加1,走一行,a+i代表行号为i的行首地址(按行变化)*(a+i)代表什么?,a,a+1,a+2,a0,a0+1,a0+2,a0+3,行指针,列指针,相当于ai,a0代表a00的地址a0+1代表a01的地址a0+2代表a02的地址a0+3代表a03的地址,a,a+1,a+2,a0,a0+1,a0+2,a0+3,行指针,列指针,列指针每加1,走一列,a1代表谁的地址?a1+1代表谁的地址?a1+2代表谁的地址?a1+3代表谁的地址?,a,a+1,a+2,a0,a0+1,a0+2,a0+3,行指针,列指针,ai+j代表谁的地址?,a,a+1,a+2,a0,a0+1,a0+

21、2,a0+3,行指针,列指针,代表aij的地址,*(ai+j)代表什么?,代表元素aij,*(*(a+i)+j)代表什么?,与*(ai+j)等价,2.指向多维数组元素的指针变量(1)指向数组元素的指针变量 例8.12 有一个34的二维数组,要求用指向元素的指针变量输出二维数组各元素的值。,#include int main()int a34=1,3,5,7,9,11,13,15,17,19,21,23;int*p;for(p=a0;pa0+12;p+)if(p-a0)%4=0)printf(“n”);printf(“%4d”,*p);printf(n);return 0;,控制换行,逐个访问各

22、元素时常用此类指针,(2)指向由个元素组成的一维数组的指针变量 例8.13 输出二维数组任一行任一列元素的值。,#include int main()int a34=1,3,5,7,9,11,13,15,17,19,21,23;int(*p)4,i,j;p=a;printf(“enter row and colum:);scanf(“%d,%d”,行指针,aij,8.4 通过指针引用字符串,8.4.1 字符串的引用方式8.4.2 字符指针作函数参数8.4.3 使用字符指针变量和字符数组的比较,8.4.1 字符串的引用方式,引用一个字符串,可以用以下两种方法。(1)用字符数组存放一个字符串,可以

23、通过数组名和“%s”输出该字符串,也可以通过数组名和下标引用字符串中一个字符。(2)用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。,例8.16 定义一个字符数组,在其中存放字符串“I love China!”,输出该字符串和第8个字符。解题思路:定义字符数组string,对它初始化。用数组名string和%s可以输出整个字符串。用数组名和下标可以引用任一数组元素。,#include int main()char string=“I love China!”;printf(“%sn”,string);printf(“%cn”,string7);return 0;,例8.17

24、通过字符指针变量输出一个字符串。解题思路:可以不定义字符数组,只定义一个字符指针变量,用它指向字符串常量中的字符。通过字符指针变量输出该字符串。,#include int main()char*string=“I love China!”;printf(“%sn”,string);return 0;,string,char*string;string=”I love China!”;,#include int main()char*string=“I love China!”;printf(“%sn”,string);string=”I am a student.”;printf(“%sn”,

25、string);return 0;,string,#include int main()char*string=“I love China!”;printf(“%sn”,string);string=”I am a student.”;printf(“%sn”,string);return 0;,string,例8.18 将字符串a复制为字符串b,然后输出字符串b。解题思路:定义两个字符数组a和b,用“I am a student.”对a数组初始化。将a数组中的字符逐个复制到b数组中。,#include int main()char a=“I am a student.”,b20;int i;

26、for(i=0;ai!=0;i+)bi=ai;bi=0;printf(“string a is:%sn”,a);printf(string b is:);for(i=0;bi!=0;i+)printf(“%c”,bi);printf(n);return 0;,printf(string b is:%sn“,b);,例8.19 用指针变量来处理例8.18问题。解题思路:定义两个指针变量p1和p2,分别指向字符数组a和b。改变指针变量p1和p2的值,使它们顺序指向数组中的各元素,进行对应元素的复制。,#include int main()char a=I am a boy.,b20,*p1,*p2

27、;p1=a;p2=b;for(;*p1!=0;p1+,p2+)*p2=*p1;*p2=0;printf(“string a is:%sn”,a);printf(“string b is:%sn”,b);return 0;,8.4.2 字符指针作函数参数,例8.20 用函数调用实现字符串的复制。解题思路:定义一个函数copy_string用来实现字符串复制的功能,在主函数中调用此函数.,#include int main()void copy_string(char*from,char*to);char a=“I am a teacher.”;char b=“you are a student.

28、”;char*from=a,*to=b;printf(“a=%snb=%sn,a,b);printf(ncopy string a to string b:n);copy_string(from,to);printf(“a=%snb=%sn,a,b);return 0;,void copy_string(char*from,char*to)for(;*from!=0;from+,to+)*to=*from;*to=0;,8.4.3 使用字符指针变量和字符数组的比较,(1)赋值方式。可以对字符指针变量赋值,但不能对数组名赋值。char*a;a=”I love China!”;对char str1

29、4;str=”I love China!”;错,8.4.3 使用字符指针变量和字符数组的比较,(2)字符数组中各元素的值是可以改变的,但字符指针变量指向的字符串常量中的内容是不可以被取代的。char a=”House”,*b=”House”;a2=r;对char a=”House”,*b=”House”;b2=r;错,8.5 指向函数的指针,什么是函数指针用函数指针变量调用函数,什么是函数指针,如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址,称为这个函数的指针。,什么是函数指针,可以定义一个指向函数的指针变量,用来存放某一函数的起始地址,这就意

30、味着此指针变量指向该函数。定义指向函数的指针变量的一般形式为 数据类型(*指针变量名)(函数参数表列);如 int(*p)(int,int);,8.5.2 用函数指针变量调用函数,例8.22 用函数求整数a和b中的大者。解题思路:定义一个函数max,实现求两个整数中的大者。在主函数调用max函数,除了可以通过函数名调用外,还可以通过指向函数的指针变量来实现。分别编程并作比较。,(1)通过函数名调用函数#include int main()int max(int,int);int a,b,c;printf(please enter a and b:);scanf(%d,%d,int max(in

31、t x,int y)int z;if(xy)z=x;else z=y;return(z);,(2)通过指针变量访问它所指向的函数#include int main()int max(int,int);int(*p)(int,int);int a,b,c;p=max;printf(please enter a and b:);scanf(%d,%d,必须先指向,若写成p=max(a,b);错,只能指向函数返回值为整型且有两个整型参数的函数,8.6 返回指针值的函数,一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址。其概念与以前类似,只是返回的值的类型是指针类型而已定义

32、返回指针值的函数的一般形式为 类型名*函数名(参数表列);,例8.25有a个学生,每个学生有b门课程的成绩。要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数实现。,解题思路:定义二维数组score存放成绩定义查找函数search,返回值为指针主函数将score和要找的学号k传递给search函数的返回值是&scorek0(k号学生的序号为0的课程地址)在主函数中输出该生的全部成绩,#include int main()float score 4=60,70,80,90,56,89,67,88,34,78,90,66;float*search(float(*pointer)4,in

33、t n);float*p;int i,k;scanf(“%d”,返回k号学生课程首地址,float*search(float(*pointer)4,int n)float*pt;pt=*(pointer+n);return(pt);,8.7 指针数组和多重指针,8.7.1 什么是指针数组8.7.2 指向指针数据的指针8.7.3 指针数组作main函数的形参,8.7.1 什么是指针数组,一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。定义一维指针数组的一般形式为 类型名*数组名数组长度;int*p4;,8.7.1 什么是指针数

34、组,指针数组比较适合用来指向若干个字符串,使字符串处理更加方便灵活可以分别定义一些字符串,然后用指针数组中的元素分别指向各字符串由于各字符串长度一般是不相等的,所以比用二维数组节省内存单元,8.7.1 什么是指针数组,例8.27 将若干字符串按字母顺序(由小到大)输出。解题思路:定义一个指针数组,用各字符串对它进行初始化,然后用选择法排序,但不是移动字符串,而是改变指针数组的各元素的指向。,#include#include int main()void sort(char*name,int n);void print(char*name,int n);char*name=“Follow”,“G

35、reat”,“FORTRAN”,“Computer”;int n=4;sort(name,n);print(name,n);return 0;,void sort(char*name,int n)char*temp;int i,j,k;for(i=0;i0)k=j;if(k!=i)temp=namei;namei=namek;namek=temp;,void sort(char*name,int n)char*temp;int i,j,k;for(i=0;i0)k=j;if(k!=i)temp=namei;namei=namek;namek=temp;,i=0时,执行后k变为3,void so

36、rt(char*name,int n)char*temp;int i,j,k;for(i=0;i0)k=j;if(k!=i)temp=namei;namei=namek;namek=temp;,void sort(char*name,int n)char*temp;int i,j,k;for(i=0;i0)k=j;if(k!=i)temp=namei;namei=namek;namek=temp;,i=1时,执行后k变为2,void sort(char*name,int n)char*temp;int i,j,k;for(i=0;i0)k=j;if(k!=i)temp=namei;namei=

37、namek;namek=temp;,void sort(char*name,int n)char*temp;int i,j,k;for(i=0;i0)k=j;if(k!=i)temp=namei;namei=namek;namek=temp;,i=2时,执行后k变为3,void sort(char*name,int n)char*temp;int i,j,k;for(i=0;i0)k=j;if(k!=i)temp=namei;namei=namek;namek=temp;,void sort(char*name,int n)char*temp;int i,j,k;for(i=0;i0)k=j;

38、if(k!=i)temp=namei;namei=namek;namek=temp;,void sort(char*name,int n)char*temp;int i,j,k;for(i=0;i0)k=j;if(k!=i)temp=namei;namei=namek;namek=temp;,void print(char*name,int n)int i;for(i=0;in;i+)printf(“%sn”,namei);,void print(char*name,int n)int i;for(i=0;in;i+)printf(“%sn”,namei);,8.7.2 指向指针数据的指针,在

39、了解了指针数组的基础上,需要了解指向指针数据的指针变量,简称为指向指针的指针。,name,p,例8.28 使用指向指针数据的指针变量。char*name=“Follow”,“Great”,“FORTRAN”,“Computer”;char*p;int i;for(i=0;i5;i+)p=name+i;printf(%sn,*p);,name,p,例8.29 有一个指针数组,其元素分别指向一个整型数组的元素,用指向指针数据的指针变量,输出整型数组各元素的值。,#include int main()int a5=1,3,5,7,9;int*num5=,p,8.7.3 指针数组作main函数的形参,

40、指针数组的一个重要应用是作为main函数的形参。在以往的程序中,main函数的第一行一般写成以下形式:int main()或 int main(void)表示main函数没有参数,调用main函数时不必给出实参。这是一般程序常采用的形式。,8.7.3 指针数组作main函数的形参,实际上,在某些情况下,main函数可以有参数,例如:int main(int argc,char*argv)其中,argc和argv就是main函数的形参,它们是程序的“命令行参数”。argv是*char指针数组,数组中每一个元素(其值为指针)指向命令行中的一个字符串。,8.7.3 指针数组作main函数的形参,通常

41、main函数和其他函数组成一个文件模块,有一个文件名。对这个文件进行编译和连接,得到可执行文件(后缀为.exe)。用户执行这个可执行文件,操作系统就调用main函数,然后由main函数调用其他函数,从而完成程序的功能。,8.7.3 指针数组作main函数的形参,main函数的形参是从哪里传递给它们的呢?显然形参的值不可能在程序中得到。main函数是操作系统调用的,实参只能由操作系统给出。,#include int main(int argc,char*argv)while(argc1)+argv;printf(“%sn”,*argv);-argc;return 0;,在VC+环境下编译、连接后

42、,“工程”“设置”“调试”“程序变量”中输入“China Beijing”,再运行就可得到结果,8.8 动态内存分配与指向它的指针变量,8.8.1 什么是内存的动态分配8.8.2 怎样建立内存的动态分配8.8.3 void指针类型,8.8.1 什么是内存的动态分配,非静态的局部变量是分配在内存中的动态存储区的,这个存储区是一个称为栈的区域C语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据需要时随时开辟,不需要时随时释放。这些数据是临时存放在一个特别的自由存储区,称为堆区,8.8.2 怎样建立内存的动态分配,对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc,ca

43、lloc,free,realloc这4个函数。,8.8.2 怎样建立内存的动态分配,malloc函数其函数原型为 void*malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间函数的值是所分配区域的第一个字节的地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置,8.8.2 怎样建立内存的动态分配,malloc(100);开辟100字节的临时分配域,函数值为其第1个字节的地址 注意指针的基类型为void,即不指向任何类型的数据,只提供一个地址如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL),8.

44、8.2 怎样建立内存的动态分配,2calloc函数其函数原型为 void*calloc(unsigned n,unsigned size);其作用是在内存的动态存储区中分配n个长度为size的连续空间,这个空间一般比较大,足以保存一个数组。,8.8.2 怎样建立内存的动态分配,用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为size。这就是动态数组。函数返回指向所分配域的起始位置的指针;如果分配不成功,返回NULL。如:p=calloc(50,4);开辟504个字节的临时分配域,把起始地址赋给指针变量p,8.8.2 怎样建立内存的动态分配,3free函数其函数

45、原型为 void free(void*p);其作用是释放指针变量所指向的动态空间,使这部分空间能重新被其他变量使用。p应是最近一次调用calloc或malloc函数时得到的函数返回值。,8.8.2 怎样建立内存的动态分配,free(p);释放指针变量所指向的已分配的动态空间 free函数无返回值,8.8.2 怎样建立内存的动态分配,4.realloc函数其函数原型为void*realloc(void*p,unsigned int size);如果已经通过malloc函数或calloc函数获得了动态空间,想改变其大小,可以用recalloc函数重新分配。,8.8.2 怎样建立内存的动态分配,用r

46、ealloc函数将p所指向的动态空间的大小改变为size。p的值不变。如果重分配不成功,返回NULL。如 realloc(p,50);将p所指向的已分配的动态空间改为50字节,8.8.2 怎样建立内存的动态分配,以上4个函数的声明在stdlib.h头文件中,在用到这些函数时应当用“#include”指令把stdlib.h头文件包含到程序文件中。,8.8.3 void指针类型,例8.30 建立动态数组,输入5个学生的成绩,另外用一个函放数检查其中有无低于60分的,输出不合格的成绩。,8.8.3 void指针类型,解题思路:用malloc函数开辟一个动态自由区域,用来存5个学生的成绩,会得到这个动

47、态域第一个字节的地址,它的基类型是void型。用一个基类型为int的指针变量p来指向动态数组的各元素,并输出它们的值。但必须先把malloc函数返回的void指针转换为整型指针,然后赋给p1,#include#include int main()void check(int*);int*p1,i;p1=(int*)malloc(5*sizeof(int);for(i=0;i5;i+)scanf(%d,p1+i);check(p1);return 0;,void check(int*p)int i;printf(They are fail:);for(i=0;i5;i+)if(pi60)prin

48、tf(%d,pi);printf(n);,8.9有关指针的小结,1.首先要准确地弄清楚指针的含义。指针就是地址,凡是出现“指针”的地方,都可以用“地址”代替,例如,变量的指针就是变量的地址,指针变量就是地址变量要区别指针和指针变量。指针就是地址本身,而指针变量是用来存放地址的变量。,8.9有关指针的小结,2.什么叫“指向”?地址就意味着指向,因为通过地址能找到具有该地址的对象。对于指针变量来说,把谁的地址存放在指针变量中,就说此指针变量指向谁。但应注意:只有与指针变量的基类型相同的数据的地址才能存放在相应的指针变量中。,8.9有关指针的小结,void*指针是一种特殊的指针,不指向任何类型的数据

49、,如果需要用此地址指向某类型的数据,应先对地址进行类型转换。可以在程序中进行显式的类型转换,也可以由编译系统自动进行隐式转换。无论用哪种转换,读者必须了解要进行类型转换,8.9有关指针的小结,3.要深入掌握在对数组的操作中怎样正确地使用指针,搞清楚指针的指向。一维数组名代表数组首元素的地址,8.9有关指针的小结,int*p,a10;p=a;p是指向int类型的指针变量,p只能指向数组中的元素,而不是指向整个数组。在进行赋值时一定要先确定赋值号两侧的类型是否相同,是否允许赋值。对“p=a;”,准确地说应该是:p指向a数组的首元素,8.9有关指针的小结,4.有关指针变量的定义形式的归纳比较,见主教

50、材中表8.4。,8.9有关指针的小结,5.指针运算指针变量加(减)一个整数例如:p+,p-,p+i,p-i,p+=i,-=i等均是指针变量加(减)一个整数。将该指针变量的原值(是一个地址)和它指向的变量所占用的存储单元的字节数相加(减)。,8.9有关指针的小结,5.指针运算(2)指针变量赋值将一个变量地址赋给一个指针变量不应把一个整数赋给指针变量,8.9有关指针的小结,5.指针运算(3)两个指针变量可以相减如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数,8.9有关指针的小结,5.指针运算(4)两个指针变量比较若两个指针指向同一个数组的元素,则可以进行比较

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号