2019/02/10训练日记——指针总结
一、指针的基本概念
1.每个变量都被存放在某个内存地址(以字节为单位)开始的若干个字节中。若干个字节(根据类型确定字节)
2.指针,也称作“指针变量“,大小为4个字节(或8个字节)的变量,其内容代表一个内存地址。
3.通过指针能够对任意地址的内存区域进行读写。
4.将内存比作房间,则指针内存储的是房间号。
二、指针的定义
类型名*指针变量名
int *p; //p是一个指针变量,变量p类型是int *
char * q; //q是一个指针变量,变量q的类型是char *
double *r; //r是一个指针变量,变量r的类型是 double *
void *s; //s是一个指针变量,变量s无类型。
三、指针的内容
int * w=(int *) 40000;
w的内容,w是指向的地址40000。*w的内容,*w是w地址40000起始的若干字节(sizeof(int))的所储存的内容。
通过指针访问指向的内存空间
int*p=int *40000;//指向向地址40000;
*p =123; 将123存入p所指向的地址后的若干字节(sizeof(int))的内存空间。
int n=*p,将p所指向的地址后的若干字节(sizeof(int))的内存空间赋值给 n;
四、补充
1.*和&的区别
(1)*p是指指针p指向地址的那个变量,例如int a=5;int *p=a;那么p的值是a的地址,也就是指针p指向a,p则等于a的值,即p=5。
(2)&,则是引用,比如说有定义int a=5;再定义int b=&a;那么这里的b则引用a的值,即b=5,而再给b赋值:b=10,a的值也会变为10。
(3)函数定义里的参数*和&的区别:
int x=0;
int *w=x;
定义函数: int a1(int a);
{
a=5;
return 1;
}
定义函数: int a2(int &a);
{
a=5;
return 1;
}
定义函数: int a3(int *a);
{
a=5;
return 1;
}
(1) 调用 int a1(x)后x的值还是等于0;int a其中a为形参,x为实参,函数调用的过程实际上是一种传参过程。将x的值赋给a后,函数操作与x无关,即a=x;a=5;
(2)调用 int a2(x)后,x的值等于5;因为这里a引用了x的值。
(3)调用 int a3(x)后,x的值也得等于5;此时不再是传参,而是传址,相当于w=a,w与a所指向地址相同。改变*a所指内容就改变 * w所指向的内容
五、 指针的赋值(用法)
指针的用法
char a=‘A’;
char * p=&a;
char *m;
m=p;
int *t;
t=(int) p;类型不匹配,编译出错,但可以使用强制类型转换。
cout<<*p;
可以使用char * a=6161(地址)但容易运行出现问题,因为地址不明确,不知道是本程序的内存地址,还是系统内存地址,或者某进程的地址。一般使用方式如上述。
指针的运算
- 两个同类型的指针变量,可以比较大小
地址p1<地址p2,->p1< p2 值为真。
地址p1=地址p2,->p1== p2 值为真
地址p1>地址p2,->p1 > p2 值为真 - 两个同类型的指针变量,可以相减
两个T * 类型的指针p1和p2
p1 – p2 = ( 地址p1 – 地址p2 ) / sizeof(T)
例:int * p1, * p2;
若p1 指向地址100,p2 指向地址60, 则
p1 – p2 = (1000 – 600)/sizeof(int) = (100 – 60)/4 = 10
3)指针变量加减一个整数的结果仍是指针
int p;
int n=a(a为某常数);
p+n:地址p+asieof(int)
则类型为char或其他时,n+p、n-p时, (n+p)、(n-p)时都应该明白其含义。
4)自增运算自减运算
int *p=n;
p++,++p;表达n=n+sizeof(int)
$ ¥ $ ¥指针运算可以使用下标运算符[ ]
int *p;
int n;
p[n]等价于 *[p+n]这不就是数组吗?
例题
访问int型变量a前面一字节
int a;
char *p=(char*)&a;
--p;
*p='M';
cout<<*p;
空指针
地址0不能访问。指向地址0的指针就是空指针
可以用“NULL”关键字对任何类型的指针进行赋值。NULL实际上
就是整数0,值为NULL的指针就是空指针:
int * pn = NULL; char * pc = NULL; int * p2 = 0;
指针可以作为条件表达式使用。如果指针的值为NULL,则相当于为
假,值不为NULL,就相当于为真
if§=== if(p!=NULL) <----------> ensp if(!p)=== if( p==NULL )