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(地址)但容易运行出现问题,因为地址不明确,不知道是本程序的内存地址,还是系统内存地址,或者某进程的地址。一般使用方式如上述。

指针的运算
  1. 两个同类型的指针变量,可以比较大小
    地址p1<地址p2,->p1< p2 值为真。
    地址p1=地址p2,->p1== p2 值为真
    地址p1>地址p2,->p1 > p2 值为真
  2. 两个同类型的指针变量,可以相减
    两个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+a
    sieof(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 )

指针与数组的关系密不可分,明天整理。

原文地址:https://www.cnblogs.com/lunatic-talent/p/12799106.html