您好,欢迎访问三七文档
1指针Copyright2008ByNeusoftGroup.Allrightsreserved指针目标:介绍指针的概念以及指针在数组中的使用方法,通过本节的学习,应该掌握如下知识:内存地址与指针的概念指针与一维数组(重点)指针与二维数组(难点)指针与字符串(重点)1.指针的基本概念程序中:inti;floatk;内存中每个字节有一个编号-----地址…...…...200020042008内存0ik1.1地址…...…...200020042008整型变量i10变量i_pointer2000指针变量变量的内容变量的地址i_pointer200010i变量i地址是2000,指针变量i_pointer地址是20041.2指针的定义概念:又称指针变量,存放另外一个变量地址的变量指针的定义的语法形式:[存储类型]数据类型*指针名;合法标识符指针变量本身的存储类型指针的目标变量的数据类型表示定义指针变量不是‘*’运算符例int*p1,*p2;float*q;staticchar*name;注意:1、int*p1,*p2;与int*p1,p2;的区别2、指针名是p1,p2,不是*p1,*p23、指针只能指向定义时所规定类型的变量4、指针定义后,必须先赋值后使用1.2指针的定义直接访问:按变量地址存取变量值间接访问:通过指针访问变量例i=3;-----直接访问指针…...…...20002008整型变量i10变量i_pointer200420003例i_pointer=&i;*i_pointer=20;-----间接访问201.3变量的访问&:取地址运算符返回变量的地址*:指针运算符返回指针所指向的变量的内容*i_pointer等价于变量iiinti,*p;p=&i;int*p;int*q;p=q;inti;float*p;p=&i;int*p;p=100;指针只存放地址,不能直接赋值为一个整数(0除外)!一个指针不能指向与其类型不同的变量!我是真的,你猜对了吗?指针必须先赋值后使用正确的使用方法inti,*p;p=&i;int*p,a[10];p=a;int*p,a[10];p=&a[0];int*p,a[10];p=&a[5];int*p,*q,a=2;p=&a;q=&a;1.3变量的访问例inti,j;int*p1=&i,*p2=&j;例inti;float*p=&i;P只能指向float类型的变量等价于inti,j;int*p1,*p2,;p1=&i;p2=&j;1.4指针的初始化语法格式:[存储类型]数据类型*指针名=初始地址值;例1#includeiostreamusingnamespacestd;intmain(){inta;int*pa=&a;a=10;couta:aendl;cout*pa:*paendl;cout&a:&aendl;coutpa:paendl;cout&pa:&pa;return0;}#includeiostreamusingnamespacestd;intmain(){inta,b;int*p1,*p2;a=100;b=10;p1=&a;p2=&b;couta=a,b=bendl;cout*p1=*p1,*p2=*p2;return0;}例2例3输入两个数至两个变量,并交换这两个变量的值#includeiostreamusingnamespacestd;intmain(){int*p1,*p2,*p,a,b;cout请输入a、b的值:;cinab;p1=&a;p2=&b;cout交换前endl----------------endl;couta=a,b=bendl;cout&a=&a,&b=&bendl;cout*p1=*p1,*p2=*p2endl;coutp1=p1,p2=p2endl;if(ab){p=p1;p1=p2;p2=p;}cout“交换后endl----------------endl;couta=a,b=bendl;cout&a=&a,&b=&bendl;cout*p1=*p1,*p2=*p2endl;coutp1=p1,p2=p2;return0;}交换的是p1与p2的值p未赋值先使用{*p=*p1;*p1=*p2;*p2=*p}修改:输入两个数至两个变量,并交换这两个变量的值#includeiostreamusingnamespacestd;intmain(){int*p1,*p2,*p,a,b,t;cout请输入a、b的值:;cinab;p1=&a;p2=&b;p=&t;cout交换前endl----------------endl;couta=a,b=bendl;cout&a=&a,&b=&bendl;cout*p1=*p1,*p2=*p2endl;coutp1=p1,p2=p2endl;修改:输入两个数至两个变量,并交换这两个变量的值if(ab){*p=*p1;*p1=*p2;*p2=*p;}cout“交换后endl---------endl;couta=a,b=bendl;cout&a=&a,&b=&bendl;cout*p1=*p1,*p2=*p2endl;coutp1=p1,p2=p2;return0;}{t=*p1;*p1=*p2;*p2=t;}定义:指针变量值为零语法格式:int*p=0;或int*p=NULL注:p为空指针与未对p赋值不同用途:避免指针变量的非法引用,在程序中常作为状态比较例int*p;……while(p!=NULL){......}1.5空指针+、-例:shortint*p,*q,a[5],k;p=a;p++;p--;p=p+3;p=p-3;q=p;q=p+3;k=q-p;60006001600260036004600560066007600860092.指针的运算2.1算术运算a[0]a[1]a[2]a[3]a[4]指针运算一般只进行指针和整数的加减运算,同类型指针之间的减法运算其它运算,比如乘法、除法、指针之间的加法等,并无意义,所以也不支持例:intn=17,*p=&n,m;m=(*p)++;//m=17;n=18m=*p++;//m=17;n=17;p指向未知空间++和*的优先级相同,结合性为自右向左等价于:m=*(p++)可分解为下面两条语句:m=*p;p=p+1;2.指针的运算2.1算术运算2.指针的运算2.2关系运算、=、、=、==、!=指向同一种数据类型的两个指针才能进行关系运算,值为1或0,如:pqpqp==q不能与非指针类型变量进行比较,但可与NULL(即0值)进行等或不等的关系运算,如:判断p是否为空指针:P==NULL例:shortint*p,a[10];p=a;此时,数组元素a[i]有如下几种等价引用形式*(a+i)p[i]*(p+i)60006001600260036004600560066007a[0]a[1]a[2]a[3]aa+1a+260006001600260036004600560066007a[0]a[1]a[2]a[3]app++p++3.指针与一维数组p例4:输入输出数组的全部元素#includeiostreamusingnamespacestd;intmain(){inta[10];inti;for(i=0;i10;i++)cina[i];for(i=0;i10;i++)couta[i]'';return0;}#includeiostreamusingnamespacestd;intmain(){inta[10];int*p,i;for(p=a;p=a+9;p++)cin*p;for(p=a;p=a+9;p++)cout*p'';return0;}方法1:下标法方法2:指针法3.指针与一维数组例4:输入输出数组的全部元素#includeiostreamusingnamespacestd;intmain(){inta[10];inti;for(i=0;i10;i++)cina[i];for(i=0;i10;i++)cout*(a+i)'';return0;}方法3:计算法3.指针与一维数组实际应用中很少用例5:#includeiostreamusingnamespacestd;intmain(){inti;inta[3][2]={1,2,3,4,5,6};int*p=&a[0][0];for(i=0;i=5;i++)cout*p++'';return0;}4.指针与二维数组回顾:二维数组在内存中按照先行后列的次序连续存放5.指针与字符串字符串与字符数组、字符指针C语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理字符串一串以'\0'结尾的字符字符数组每个元素都是字符类型的数组charstring[100];字符指针指向字符类型的指针char*p;一般字符数组和字符指针都用来处理字符串5.指针与字符串字符指针变量与字符数组的区别定义方法不同charstr[10];char*ptr;初始化含义不同charstr[10]={“china”};//为数组中的每个元素赋初值char*ptr=“china”;//用字符串“china”的首地址,给指针变量ptr赋初值。5.指针与字符串字符指针变量与字符数组的区别赋值方法不同charstr[10];str=”china”;/*错误*/strcpy(str,”china”);/*正确*/char*ptr;ptr=”china”;/*正确*/字符指针是变量,而数组名是地址常量指针p可整体重新赋值p=ProgrammingLanguageC;a的元素可以重新赋值,但只能通过字符串复制的方法或者为每个元素重新赋值的方法如:a[8]='e';a[9]='r';a[10]='\0';a的内容现在变成“Programmer”p和a类型不同,大小不同a占12个字符的空间,p占4个字节programming\0指针pprogramming\0数组a(a)(b)字符指针变量与字符数组的区别5.指针与字符串使用字符指针的注意事项字符指针变量必须有明确的指向,否则使用是危险的例如,输入字符串时char*a;scanf(%s,a);/*错误*/应为:char*a;charstr[10];a=str;scanf(%s,a);/*正确*/例6计算字符串的长度#includeiostreamusingnamespacestd;intmain(void){chara[100];char*p=a;inti=0;gets(p);for(;*p;p++)i++;cout字符串的长度为:i;return0;}例7实现两个字符串的复制#includeiostreamusingnamespacestd;intmain(){chara[100],b[100];char*p=a,*q=b;inti;puts(请输入字符串a:);gets(p);puts(请输入字符串b:);gets(q);for(;*q;p++,q++)*p=*q;*p=0;cout字符串a为:a字符串b为:b;return0;}例8判断一个字符串是否为回文串#includeiostream#include
本文标题:c++ 指针讲解
链接地址:https://www.777doc.com/doc-3391269 .html