您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > C语言指针(含例子)
C语言程序设计大赛培训之指针教学实践部计算机中心胡晓丽指针的用途指针在C语言里应用极为广泛,是C语言的灵魂使程序简洁、紧凑、高效函数调用时批量参数的传递内存的动态分配内存地址的直接处理复杂数据结构的简洁表达等许多其它数据类型难以实现的复杂操作培训目的掌握指针的概念、指针变量定义格式和引用掌握指针的运算方法指针应用举例理解指针指针就是内存中的变量的地址理解指针内存单元的编号:计算机内存中,每一个字节的存储单元都有一个编号(亦称为内存地址)在VC中,内存单元的编号是一个8位的十六进制数(表示32位二进制数,VC是32位编译系统)如:0013FF7C……0013FF7C0013FF7B0013FF7A0013FF79……0013FF00…..理解指针变量:实质是代表了“内存中的某个存储单元”。若在内存中定义了一个变量,则这个变量的内存的地址也就确定了。理解指针变量的地址:表示变量在内存中的位置,其值是该变量在内存中所占存储单元的首字节的编号程序中:inti;floatk;内存中每个字节有一个编号-----地址…...…...2000200120022005内存02003ik编译或函数调用时为其分配内存单元变量是对程序中数据存储空间的抽象理解指针a在内存中占4个字节,但&a的值是4个字节中首个字节的编号运算符&:取地址,如&a的值为变量a的地址变量地址的输出可以用格式字符串“%p”#includestdio.hvoidmain(){inta;a=8;printf(%d%p\n,a,&a);}……0013FF7C000000000013FF7B000000000013FF7A000000000013FF7900001000……0013FF00…..理解指针理解指针我们在程序中只需要指出变量名,无需知道每个变量在内存中的具体地址,每个变量与具体地址的联系是由C编译系统来完成的。对变量的存取操作就是对某个存储单元进行操作。这种直接按变量的地址存取变量值的方式称为“直接存取”。4502实验室二我有几种方法可以到实验室上机?2、按实验室所在的教室编号1、按实验室名字按变量名按变量地址(即指针)实验室一实验室三45034707理解指针理解指针指针:也是一种变量,这种变量是用来存放内存地址的。指针变量指针是字节的编号,即地址。指针也是要存储的,因此每个指针也需要一个变量来存储它。这个变量称为指针变量。指针变量的值是某一定义好的变量的地址。理解指针变量&a2001p=&a;1011ap例:int*p;inta=3;101220020000001100000000间接存取:这种通过变量p到变量a的地址,然后再存取变量a的值的方式称为“间接存取”。指针变量p指向了变量a的含义是:指针p中存放了变量a的地址。指针变量的定义定义形式如下:数据类型*指针变量名;如:int*p1,num;表示的意思为:定义了一个指针变量p1,它指向的是一个整型数据。或者说,这时候p1中存储的是一个整型变量的地址。注意:指针变量定义了之后,需要给它赋一个确定的变量的地址,否则,就会出现严重的系统错误。指针变量的引用#includestdio.hmain(){inta;//定义一个整型变量aint*p1;//定义指向整型变量的指针p1p1=&a;//p1中应存放变量a的地址*p1=5;//通过指针变量p1给a赋值printf(a=%d,a);}例:int**p,*s,k=20;s=&k;p=&s;…...…...2000200420062005整型变量k变量s200120022003变量p20072008202000200020042004s=*pk=*s所以:k=**p说明:(1)指针p的基类型是int类型的指针。(2)&是求地址运算符。(3)因为基本数据类型int、float、char等所需存储空间不同,所以需要定义指针变量的基类型。例:指针的概念main(){inta;int*pa=&a;a=10;printf(a:%d\n,a);printf(*pa:%d\n,*pa);printf(&a:%x(hex)\n,&a);printf(pa:%x(hex)\n,pa);printf(&pa:%x(hex)\n,&pa);}运行结果:a:10*pa:10&a:f86(hex)pa:f86(hex)&pa:f88(hex)…...…...f86f8af8cf8b整型变量a10指针变量paf87f88f89f86指针的运算方法指针的移动所谓移动指针就是对指针变量加上或减去一个整数,或通过赋值运算,使指针指向相邻的存储单元。只有当指针指向一串连续的存储单元时,还可以和指向同一串连续存储单元的指针进行相减的运算,除此之外,不可以对指针进行任何其它的算术运算。指针的运算方法①指针变量只能进行逻辑运算和相减的算术运算。②不是指向同一数组的指针变量运算是无意义的。③指针变量的值加1或减1,并不是地址加1中减1,而是加上或减去该变量在内存中所占的字节数,该字节数由指针的基类型决定。指针的移动111122334455a0a1a2a3a4pqDD00DD02DD04DD06DD08DD0ADD0CDD0EDD10ijDD12DD14DD16p=&a0;DD00q=p+2;DD04q++;DD06q--;DD04i=*p;11j=*q;33例:指针的运算方法指针的比较在关系表达式中,可以对指针进行比较。即两个变量地址的比较。通常两个或多个指针指向同一目标时(一串连续的存储单元),比较才有意义。指针应用举例-指针作为函数的参数指针可以作为参数在主调函数和被调用函数之间传递数据,通过指针可以在被调用函数中地调用中的变量进行引用,这也就使得通过形参改变对应实参的值有了可能,利用此形式就可以把两个或两个以上的数据从被调用的函数返回到调用函数。例将数从大到小输出指针应用举例-指针作为函数的参数swap(intx,inty){inttemp;temp=x;x=y;y=temp;}main(){inta,b;scanf(%d,%d,&a,&b);if(ab)swap(a,b);printf(\n%d,%d\n,a,b);}指针应用举例-指针作为函数的参数…...…...20002008200A2002200420065变量a变量b(main)9变量temp变量y变量x(swap)55959COPYswap(intx,inty){inttemp;temp=x;x=y;y=temp;}main(){inta,b;scanf(%d,%d,&a,&b);if(ab)swap(a,b);printf(\n%d,%d\n,a,b);}指针应用举例-指针作为函数的参数swap(intx,inty){inttemp;temp=x;x=y;y=temp;}main(){inta,b;scanf(%d,%d,&a,&b);if(ab)swap(a,b);printf(\n%d,%d\n,a,b);}值传递…...…...20002008200A2002200420065变量a变量b(main)9运行结果:5,9变量x变量y(swap)变量t59595swap(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}main(){inta,b;int*pointer_1,*pointer_2;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(\n%d,%d\n,a,b);}…...20002008200A200220042006200C200E2010...59整型变量a整型变量b(main)指针pointer_1指针pointer_220002002(swap)指针p1指针p2整型p5920002002COPY5运行结果:9,5地址传递通过传送地址值,可以在被调用函数中直接改变调用函数中的变量的值指针应用举例-指针作为函数的参数指针应用举例-指向数组的指针变量例编写程序,定义一个含有15个元素的数组,并编写函数分别完成以下操作:(1)调用C库函数中的随机函数给所有元素赋以0-49之间的随机数;(2)输出数组元素中的值;(3)按顺序对每隔三个数求一个和数,并传回主函数;(4)最后输出所有求出的和值。指针应用举例-指向数组的指针变量调用随机函数的方法如下:包含头文件stdlib.hn=rand()%x;n将得到一个在0-(x-1)之间的随机数。指针应用举例-指向数组的指针变量分析:(1)由于要每隔3个数求一个和,15个数要求出5个和,所以主函数中要定义一个数组来存放5个和数。(2)两次输出元素的值,虽然输出对象不同,但是数组的类型相同,可调用一个函数来完成,只要指定不同的数组名,不同的输出个数即可。指针应用举例-指向数组的指针变量#includestdio.h#includestdlib.h#defineSIZE15#defineN3voidgetrand(int*,int);voidgetave(int*,int*,int);voidprintarr(int*,int);指针应用举例-指向数组的指针变量voidprintarr(int*a,intn){inti;for(i=0;in;i++){printf(%4d,*(a+i));if((i+1)%5==0)printf(\n);}printf(\n);}指针应用举例-指向数组的指针变量voidgetave(int*a,int*b,intn){inti,j=0,sum=0;for(i=0;in;i++){sum+=*(a+i);/*累加数组元素*/if((i+1)%3==0)/*每累加3个进行一次处理*/{b[j]=sum;sum=0;j++;}}}指针应用举例-指向数组的指针变量voidgetrand(int*a,intn){inti;for(i=0;in;i++)*(a+i)=rand()%50;}指针应用举例-指向数组的指针变量main(){intx[SIZE],w[SIZE/N]={0};/*数组中置初值为0,准备存放5个数的和*/clrscr();getrand(x,SIZE);/*调用函数产生15个随机数放入数组x中*/printf(\nOutput%drandomnumbers:\n,SIZE);printarr(x,SIZE);/*输出15个随机数*/getave(x,w,SIZE);/*每3个数求一个和放入数组w中*/printf(\nOutput5sumnumbers:\n);printarr(w,SIZE/N);/*输出5个数的和*/}指针应用举例-指向数组的指针变量指针应用举例-指向数组的指针变量例:编写程序,将数组中的数按颠倒的顺序重新存放。在操作时,只能借助一个临时存储单元而不得另外开辟数组。分析:不是要求按颠倒的顺序打印数据,而是要求按逆序重新放置数组中的内容。假定a数组中有8个元素指针应用举例-指向数组的指针变量102030405060708010011003100510071009100B100D100Fa[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]807060504030201010011003100510071009100B100D100Fa[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]指针应用举例-指向数组的指针变量(1)定义两个变量i和j,首先将a[0],a[7]进行对调,中间用到一个临时存储单元,所以定义同类型变量temp。(2)将变量i加1,j减1,满足条件ij时,将a[1]和a[6]进行对调(3)最后将a[3]和a[4]进行对调,此时i+1,j-1不再满足条件ij指针应用举例-指向数组的指针变量#includestdio.h#defineNUM8voidinvert(int*,int);v
本文标题:C语言指针(含例子)
链接地址:https://www.777doc.com/doc-3675841 .html