指针的概念一维数组与指针_第1页
指针的概念一维数组与指针_第2页
指针的概念一维数组与指针_第3页
指针的概念一维数组与指针_第4页
指针的概念一维数组与指针_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第21讲指针的概念、一维数组与指针第十章指针C程序设计中使用指针可以: 使程序简洁、紧凑、高效有效地表示复杂的数据结构动态分配内存得到多于一个的函数返回值程序中:inti;

floatk;

内存中每个字节有一个编号-----地址…...…...2000200120022005内存02003ik

编译或函数调用时为其分配内存单元变量是对程序中数据存储空间的抽象1.变量与地址10.1指针的根本概念…...…...2000200420062005整型变量i10变量i_pointer200120022003指针:一个变量的地址,它是一个整数形式的常量。指针变量:专门用来存放地址的变量叫指针变量,它的值也可以是数组或函数的地址。2000指针指针变量变量的内容变量的地址指针变量变量变量的地址(指针)变量的值指向地址存入指针变量2.指针与指针变量含义:取变量的地址单目运算符优先级:14〔第二高的级别〕结合性:自右向左含义:从某个地址中获取数据单目运算符优先级:14结合性:自右向左两者关系:互为逆运算3.取地址运算符&与指针运算符*…...…...2000200420062005整型变量i10变量i_pointer2001200220032000指针变量i_pointer-----指针变量,它的内容是地址量2000*i_pointer----指针的目标变量i,它的内容是数据10&i_pointer---指针变量占用内存的地址:2004i_pointer&i&(*i_pointer)i*i_pointer*(&i)指针运算符例如====#include<stdio.h>voidmain(){int*px,x=5;px=&x;printf("&px=0x%lx,px=0x%lx,*px=%d\n",&px,px,*px);printf("*&px=0x%lx,&*px=0x%lx\n",*&px,&*px);printf("&x=0x%lx,x=%d,*&x=%d\n",&x,x,*&x);}/*P146书印错*/运行结果:&px=0x12ff7c,px=0x12ff78,*px=5*&px=0x12ff78,&*px=0x12ff78&x=0x12ff78,x=5,*&x=5例10.1运算符“&〞和“*〞的使用例i=3;-----直接访问指针变量…...…...2000200420062005整型变量i10变量i_pointer20012002200320003例*i_pointer=20;-----间接访问20直接访问:按变量地址存取变量值间接访问:通过存放变量地址的变量去访问变量4.直接访问与间接访问1.指针变量与其所指向的变量之间的关系2.指针变量的定义一般形式:[存储类型]数据类型*指针名;3变量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=3合法标识符指针变量本身的存储类型指针的目标变量的数据类型表示定义指针变量不是乘法运算符*例int

*p1,*p2;float*q;staticchar*name;注意:1、int*p1,*p2;

与int*p1,p2;不一样。2、指针变量名是p1,p2,不是*p1,*p2。3、指针变量只能指向定义时所规定类型的变量。4、指针变量定义后,变量值不确定,应用前必须先赋值。10.2指针变量的定义与引用将地址值赋给指针变量例inti;int*p=&i;变量必须已说明过;并要求两者类型一致。例int*p=&i;inti;例inti;int*p=&i;int*q=p;用已初始化指针变量作初值例main(){inti;staticint*p=&i;()..............}不能用auto变量的地址去初始化static型指针一般形式:[存储类型]数据类型*指针名=初始地址值;3.对指针变量的操作(1)指针变量的初始化3.对指针变量的操作(续)(2)指针变量+/-整数新的地址inta,b,c,d,*p,*q;p=&b;q=p+1;…...20002008200A200220042006200C200E2010...59整型变量a整型变量b整型变量c整型变量d202259指针变量p指针变量q20022004所加的数值:整数*字节数q=p-1;p++;++p;注意:*p++;*++p;不同于(*p)++;++(*p);(3)指针变量-指针变量

整数(多少个数)q-p1;(4)关系运算p<q1;p==q0;X例main(){inti=10;int*p;*p=i;printf(“%d〞,*p);}危险!例main(){inti=10,k;int*p;p=&k;*p=i;printf(“%d〞,*p);}…...…...2000200420062005整型变量i10指针变量p200120022003随机值4.指针变量必须先赋值,再使用!零指针与空类型指针零指针:(空指针)定义:指针变量值为零例如:int*p=0;

p指向地址为0的内存单元;系统保证该单元不作它用;表示指针变量的值没有意义。#defineNULL0int*p=NULL;p=NULL与未对p赋值不同用途:防止指针变量的非法引用在程序中常作为状态比较例int*p;......while(p!=NULL){...…}5.零指针一般形式:void*类型指针;例如:void*p;

表示不指定p是指向哪一种类型数据的指针变量。使用时要进行强制类型转换。6.空类型指针例char*p1;void*p2;p1=(char*)p2;p2=(void*)p1;TC中分配内存空间的函数返回一个空类型的指针。void*malloc(intn);例如:int*p=(int*)malloc(2);×main(){int*p1,*p2,*p,a,b;a=5;b=9;p1=&a;p2=&b;if(a<b){p=p1;p1=p2;p2=p;}printf("a=%d,b=%d\n",a,b);printf("max=%d,min=%d\n",*p1,*p2);}运行结果:5,9<CR>a=5,b=9max=9,min=5…...…...指针变量p1指针变量p20002010200220042008指针变量p2整型变量b整型变量a5202192021202120212021例10.3按先大后小的顺序输出a和b两个整数。

7.多重指针

一个指针变量的内容就是内存中某个存储区域的地址,这个存储区域中存放的值可以是一个根本数据类型的数据,也可以是另一个存储区域的地址。我们把这种类型的指针叫做多重指针。二重指针(指向指针的指针)的一般说明形式为:类型说明符

**指针变量名;例10.4二重指针的使用。main(){int*p1,**p2,i=10;p1=&i;p2=&p1;printf("&i=0x%lx,i=%d\n",&i,i);printf(“&p1=0x%lx,p2=0x%lx,*p2=%d\n〞,&p1,p1,*p1);/*书错,应为p1*/printf("&p2=0x%lx,p2=0x%lx,*p2=0x%lx,**p2=%d\n",&p2,p2,*p2,**p2);}程序的运行结果如下:&i=0x12ff74,i=10&p1=0x12ff7c,p1=0x12ff74,*p1=10&p2=0x12ff78,p2=0x12ff7c,*p2=0x12ff74,**p2=10swap(intx,inty){inttemp;temp=x;x=y;y=temp;}main(){inta=10,b=20;if(a<b)swap(a,b);printf("\n%d,%d\n",a,b);}…...…...20002008200A20022004200610变量a变量b(main)20变量temp变量y变量x(swap)1010201020COPY值传递运行结果:10,20不能到达预期的结果!10.3函数之间地址值的传递1.形参为指针变量:传递的是指针变量的值----地址。特点:共享内存,相当于“双向〞传递!例10.5

将数从大到小输出(用变量作函数的参数)swap(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}main(){inta,b;int*pointer_1,*pointer_2;a=5;b=9;

pointer_1=&a;pointer_2=&b;if(a<b)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例10.5

将数从大到小输出(用指针作函数的参数)swap(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}main(){inta,b;int*pointer_1,*pointer_2;a=5;b=9;pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);printf("\n%d,%d\n",a,b);}…...20002008200A200220042006200C200E2010...59整型变量a整型变量b(main)指针pointer_1指针pointer_22000200259运行结果:9,5地址值传递例10.5

将数从大到小输出(用指针作函数的参数)续×swap(int*p1,int*p2){int*p;*p=*p1;*p1=*p2;*p2=*p;}main(){inta,b;int*pointer_1,*pointer_2;a=5;b=9;

pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);printf("\n%d,%d\n",a,b);}运行结果:9,9改正为:intx,*p=&x;x;…...20002008200A200220042006200C200E2010...59整型变量a整型变量b(main)指针pointer_1指针pointer_2200020029920002002COPY(swap)指针p1指针p2指针p****假设2000指针变量在使用前必须先赋值!例10.5

注意:指针变量要先赋值后,才能进行指针运算!编译警告!结果有时也正确!但也有错的时候!×/*ch9_32.c*/swap(intx,inty){intt;t=x;x=y;y=t;}main(){inta,b;int*pointer_1,*pointer_2;scanf("%d,%d",&a,&b);

pointer_1=&a;pointer_2=&b;if(a<b)swap(*pointer_1,*pointer_2);printf("\n%d,%d\n",a,b);}运行结果:5,9也不能到达预期的结果!值传递…...20002008200A200220042006200C200E2010...59整型a整型b(main)pointer_1pointer_2200020029COPY(swap)整型x整型b整型t5559例10.5错误程序之二×swap(int*p1,int*p2){int*p;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(a<b)swap(pointer_1,pointer_2);printf("%d,%d",*pointer_1,*pointer_2);}…...20002008200A200220042006200C200E2010...59整型a整型b(main)pointer_1pointer_22000200220002002COPY(swap)指针p1指针p2指针p****2000地址传递20002002运行结果:5,9也不能到达预期的结果!例10.5错误程序之三×2.返回值为地址值的函数〔例10.6〕#include<stdio.h>int*getLocalAddr(void);float*getMaxAddr(float*px,float*py);main(){floatx=10.0f,y=20.0f,*px=&x,*py=&y;printf("*getLocalAddr()=%d\n",*getLocalAddr());printf("&x=0x%lx,&y=0x%lx,getMaxAddr(px,py)=0x%lx\n",&x,&y,getMaxAddr(px,py));printf("px=0x%lx,py=0x%lx,*getMaxAddr(px,py)=%f\n",px,py,*getMaxAddr(px,py));}

int*getLocalAddr(){intt=100;return&t;}

float*getMaxAddr(float*px,float*py){return(*px>*py)?px:py;}array[0]array[1]array[2]array[3]array[9]...整型指针p&array[0]p数组名是表示数组首地址的地址常量!10.4

一维数组和指针

一维数组和数组元素的地址一个整数在内存中占两个连续的存储单元,排在前面的那个存储单元的地址就是这个整数的地址;长整数、实数……数组元素的地址同上。数组中的假设干个数组元素在内存中是依次连续存放的,占一片连续的内存单元,其中排在前面的那个数组元素的地址就是这个数组的地址。例10.7数组以及各个数组元素在内存中的地址

#include<stdio.h>voidmain(){inti,a[10];printf("index,Address,size:\n");for(i=0;i<10;i++)printf("&a[%d],0x%x,%d\n",i,&a[i],sizeof(a[i]));printf("Addressofa=0x%x\n",a);printf("sizeofa=%d\n",sizeof(a));}在C语言中,一维数组的任何一个元素的地址,都可以用其数组名加上一个偏移量来表示。即:&a[i]a+i

*&a[i]a[i]*(a+i)例10.7数组以及各个数组元素在内存中的地址

程序运行结果如下(VC):index,Address,size:&a[0],0x12ff54,4&a[1],0x12ff58,4&a[2],0x12ff5c,4&a[3],0x12ff60,4&a[4],0x12ff64,4&a[5],0x12ff68,4&a[6],0x12ff6c,4&a[7],0x12ff70,4&a[8],0x12ff74,4&a[9],0x12ff78,4Addressofa=0x12ff54sizeofa=40a[0]a[1]a[2]a[3]a[9]...aa+9a+1a+2地址元素下标法a[0]a[1]a[2]a[9]a[0]a[1]a[2]a[3]a[9]...pp+9p+1p+2地址元素指针法*p*(p+1)*(p+2)*(p+9)a[i]p[i]*(p+i)*(a+i)*a*(a+1)*(a+2)*(a+9)p[0]p[1]p[2]p[9]2.通过指针引用数组元素

inta[10],*p=&a[0];a=a+1;×a++;×p=p+1;√p++;√a[0]a[1]a[2]a[3]a[4]#include<stdio.h>voidmain(){inta[5],*pa,i;for(i=0;i<5;i++) a[i]=i+1;pa=a;for(i=0;i<5;i++) printf("*(pa+%d):%d\n",i,*(pa+i));for(i=0;i<5;i++) printf("*(a+%d):%d\n",i,*(a+i));for(i=0;i<5;i++) printf("pa[%d]:%d\n",i,pa[i]);for(i=0;i<5;i++) printf("a[%d]:%d\n",i,a[i]);}12345pa例数组元素的引用方法数组名作函数参数,实参与形参的对应关系实参形参数组名指针变量数组名指针变量数组名数组名指针变量指针变量3.数组名或指针作形参

ij379110675420123456789ijijijji11760594723voidinv(intx[],intn){intt,i,j,m=(n-1)/2;for(i=0;i<=m;i++){j=n-1-i; t=x[i];x[i]=x[j];x[j]=t;}}main(){inti,a[10]={3,7,9,11,0,6,7,5,4,2};inv(a,10);printf("Thearrayhasbeenreverted:\n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("\n");}m=4例将数组a中的n个整数按相反顺序存放1.

实参与形参均用数组例将数组a中的n个整数按相反顺序存放voidinv(int*x,intn){intt,*p,*i,*j,m=(n-1)/2;i=x;j=x+n-1;p=x+m;for(;i<=p;i++,j--){t=*i;*i=*j;*j=t;}}main(){inti,a[10]={3,7,9,11,0,6,7,5,4,2};inv(a,10);printf("Thearrayhasbeenreverted:\n");for(i=0;i<10;i++)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论