指针变量、指针常量与常量指针
一、指针变量
定义:指针变量是指存放地址的变量,其值是地址。
一般格式:基类型 指针变量名;(int p)
关键点:
1、int * 表示一种指针类型(此处指int 类型),p(变量名)即为定义的指针变量名。
2、在定义指针变量时必须指定基本类型,知道数据类型,才能按存储单元的长度以及数据的存储形式正确地取出数据
3、指针变量中只能存放合法的地址类型,不要将其他类型数据赋给指针变量
4、“ * ”指针运算符,表示指针变量所指向的变量,“ & ”取地址运算符,表示取变量的地址
5、引用指针变量主要有以下三种情况
int date = 0; //定义变量
int *Pointer; //定义指针变量
//1、给指针变量赋值
Pointer = &date;//把date 的地址赋给指针变量pointer,指针变量pointer的值时变量date 的地址,pointer指向date
//2、引用指针变量指向的变量
printf("%d",*pointer); //输出指针变量pointer所指向变量的值,即变量date的值(*pointer等价于date)
*pointer = 1; //将整数1赋值给指针变量pointer所指向的变量的值,即相当于把1赋值给date ,等价于“date = 1”
//3、引用指针变量的值
printf("%p",pointer);//以八进制数形式输出指针变量pointer的值,即date 的地址(&date )
注意事项:
1、指针变量作为一种变量类型,可以作为数组成员(指针数组)、函数参数、和函数返回值(指针函数),甚至可以作为保存数组地址(数组指针)或函数地址的变量(指针函数)。
2、指针变量可进行以下几种运算操作:
二、指针常量
定义:是一个常量,其值是指针,这个值因为是常量,所以不能被赋值。
个人理解就是把他看成一个地址格式的常量数据,比如在32位机器上有一个地址格式的常量数据:0x0000FFF1,首先它是作为一个常量存在,我们没办法改变它的数据值,其次它作为一个地址,它有指向固定的内存空间;因为没法改变他的值(0x0000FFF1),那么它指向的这块空间位置就固定了,但这个内存空间里放的东西可以改变。
一般格式:int* const p
关键点:
1.它是个常量!
2.指针所保存的地址可以改变,然而指针所指向的值却不可以改变
3.指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化;
注意事项:数组名也是一个指针常量,所以数组名可以作运算,但常量不能作为左值被赋值,(不能arr += 1,但可以arr++)。char str[4];str = “abc”;这种赋值方式也不行的。
int* const p1 = &a;
a = 100; //OK,可以通过原来的声明修改值,
*p1 = 10; //OK,指针常量指向的地址不可以变,但指向的地址所对应的内容可以变
//p1 = &b; //Error,不可修改,即指针常量不可修改其指向的地址
三、常量指针
定义:又叫常指针,可以理解为常量的指针,也即这个是指针,但指向的是个常量,这个常量是指针的值(地址),而不是地址指向的值。
个人理解就是有一个指针变量,这个变量可以指向不同的内存空间,但是这个内存空间必须有个条件就是里面存在的数据是个常量不能改变,(之所以所是指针变量参见以下关键点)
一般格式: int const* p; const int* p;
关键点:
1.常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改;
2.常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值;
3.指针还可以指向别处,因为指针本身只是个变量,可以指向任意地址;
const int *p1 = &a;
a = 100; //OK,仍然可以通过原来的声明修改值,
//*p1 = 50; //Error,不可修改,即常量指针指向的地址所对应的内容不可变
p1 = &b; //OK,可修改,即常量指针可修改其指向的地址;
注意事项:
四、区分方式
指针变量最好区分,没什么特点,难以区分的是指针常量和常量指针:
int const* p; //常量指针,const修饰*p,*p的内容不可通过p改变,但p可以修改,*p不可修改
const int* p; //常量指针,const修饰*p,*p的内容不可通过p改变,但p可以修改,*p不可修改
int* const p; //指针常量,const修饰p,p是指针,p指向的地址不能改,p不能修改,*p可修改
根据*在const前面还是在后面进行巧记:在前是指量,改值不改向
总结
讲个通俗易懂例子,假如有天你家拆迁给你分房子:
指针常量:你单身一人时分房,居委会给你分个门牌号码(地址常量),说这是你的房子(这个常量指向的内存空间),你只根据门牌号到几栋几单元几号房,因为门牌号和房号关系是对应好的,你改变不了,但是你单身啊,你还可以决定这房子以后的女主是谁。
常量指针:结婚后分房,居委会给你个门牌但没填号码,说这是你跟你老婆的房,告诉你现在人少,你和老婆可以选小区内任意空房然后把号码填上,且今天之内还可修改,但你结婚了,你虽然可以任意选房,但是改不了里面住的女主了。