文档介绍:第七讲    指针
指针的概念
简单地说,指针就是内存地址,它的值表示被存储的数据所在的地址,而不是被存储的内容。
说明:内存区的每一个字节称作一个存储单元,每个单元有一编号(犹如序号),这就是地址,数据也可以是程序(由一组指令码组成),也可以是程序中所处理的各种类型的数据,包括地址数据。*int ---2字节 char---1字节
实型变量---4字节,为读取单元地址内容。必须找到地址才能取数据,cout<<i执行过程是先根据变量名与地址的响应关系,找到变量的地址2000,然后从2000开始的两个字节中取数据,并输出到屏幕。这种方式称直接访问。
20000
变量 i
变量 j
变量 k
如果将内存一些单元中存放变量的地址,通过内存单元地址中的地址找到数据称为间接方式(如抽屉加锁,钥匙放在另一个地方)
又如图书馆查书
3
指针变量的定义和引用
c++用”*”符号表示“指向”,如p代表指针变量,则*p是p所指向的变量。可以看出*p同i是一回事,如i=3,*p=3,后一句定义把3赋给指针变量p所指的变量。
指针变量的定义
格式:类型标识符*标识符(即指针变量名)
例 int *p; char *pc; float *pf;
说明定义了int变量p,则p只能指向int变量。
例如:int i,*p; p=&i;
说明:“*”来标识,但“*”不是指针变量的一部分。如指针变量是p1,p2
而不是*p1,*p2;
20000
3
P(pointer)
*p (变量i)
如:int *pt;
float x=;
pt=&x(错误);
cout<<”x=”<<*pt<<endl.
说明:该程序在把地址赋给pt是并不产生错误,但当在用pt访问x时产生错误。因为pt定义为int指针。所以系统对它所指向的float数据进行类型转换,即把float指转换成int值。
“*”及是乘号又是指针运算符“&”既是按位与运算符又是一般地址运算符。
两点区别:1“*”“&”作指针和取地址运算时为一元运算符其他为二元
2“*”“&”作指针和取地址运算时优先高
4.* 和&互为逆运算设int p,i; i=3;p=&i;*p为p指向地址内容,即i的值&(*p)则为&i即p的内容。
(一)   指针变量的初始化
格式:类型标识符*指针变量名=初始化地址,如int i; int *p, p=&i; 或int *p=&i;
(二)   指针变量的引用
int i=3,*p ;
p=&i; 则对i的内容可用两种方法。1种是i,2是*p
如cout<<i 或 cout<<*p等
#include <>
int main()
说明:1 p1=&b为给p1赋值(地址值)
2&*p为结合方向自右至左
3*&p同上//P为变量
4(*p)++相当于i++
{int a,b;
int p1,p2;
a=100;b=10;
p1=&a;
p2=&b;
cout<<*p1<<”,”<<*p2;
return 0;
}
example:输入两个整数a和b,按先大后小的顺序输出a和b
#include<>
int main()
{int *p1,*p2,*p,a,b;
cin>>a>>b;
p1=&a;p2=&b;
if(a>b)
{p=p1;p1=p2;p2=p;}
cout<<”\n a=”<<*p1<<”\n b=”<<*p2;
}
P
p1
p2
a
b
指针的算术运算
+,-,++,--
设int *p ,*q,i 则p,q可进行下述运算 p+i,p-i,p++.p--.p-q,--p;
说明:指针值加1 并不是p的内容加1而是加了类型存储字节数,如int 为4个字节,则地址加4。则推出p±i 实际指向的位置是p±i*m(m是数据存储所需的字节数)字符型m=1,整型m=2,浮点m=4等;
p-q 则是p-q* m
指针的赋值运算
int main()
{int i;
int *p1,*p2;
p1=&i;
p1=p2;
cout<<”p2=”<<p2;
return 0;
}
此时输出i的地址为
* p2=65500;
说明: 不能执行p1=200;等
int *p,*q可执行p=q+I
可执行p=0一般用null表示
即p=null;(pascal nil)
说明:对p赋null与未初始化不同p=null系统保证不能指向任何变量而p未初始化则有可能指向一个事先未指定的单元,有可能造成系统“崩溃”