指针的定义:
指针是一个变量,用来存放地址的变量
指针的大小是固定的4/8个字节(32位平台/64位平台)
解引用:就是引用它指向的变量的值
int *p=&a,那么解引用就是:*p == a。
从内存来讲,系统为指针分配内存空间,而引用与绑定的的对象共享内存空间,系统不为引用变量分配内存空间。
指针初始化以后可以改变指向的对象,而引用定义的时候必须要初始化,且初值以后不允许再绑定对象。
指针的运算:
1.指针+或者-一个数,表示指针加减这个数的类型所占内存的整数倍
如 int *p=a;
p=p+2;
2.指针减去一个指针,表示两个指针之间所差的内存单元或者元素个数,两个指针相加没有意义
3.关系运算,如果定义了两个指针变量p和q,并且都已经初始化了,
如果p==q,则表示p和q指向同一个地址
p>q,则表示p指向高地址而q指向低地址
也经常拿p和NULL做比较,用来表示指针当前的状态
p1++是对地址进行加减整数
而(*p2)++, 我是定义了一个b变量,然后赋值给了10,然后把b的地址给了p2,*p2通过解引用得到的就是10,(*p)++ 相当于 10++ ,得到的就是11.
const与一级指针的结合
int a = 0;
int* p = &a;
*p = 1;
p = &b;
const int* q = &a;//q的指向的内容值不能做修改 q的指向为常变量
*q = 1;x
q = &b;√ //q是常变量 不能通过q修改元素
int* const s = &a;//s是常变量 不能企图修改s的值
*s = 1;√
s = &b;×
const int a = 1;
const int b = 2;
int* p = &a; //× 修改为const int* p = &a; 如果普通指针指向a,后面必然可以解引用p来改变a的值 ,但a是一个常变量无法修改
*p = 10;//×
const int *q = &a;//√
q = &b;//√
int const s = &a;// × const int s = &a;
s = &b;//×
*s = 20;//×
const int * const t = &a;//√
*t = 10;//×
t = &b;//×