前言:
对于初学者而言,常指针和指针常量是特别容易混淆的两个概念。
所以我准备了自从我学习C++以来对两个概念做的最通俗易懂的阐述,希望能对你有所帮助,
不当之处希望大家能批评留言指正。
No.1常指针
① 什么是常指针?
首先说明,常指针是指向常量的指针,这是习惯说法,但是并不准确。
常指针的准确定义:不可以通过 指针本身的间接引用 来修改 指针所指向的内容 的一类型指针叫常指针。
综上得出一个结论:常指针指向的数据既 可以是常量也可以是变量,只是不能通过指针去改变数据的内容。
②常指针是干什么用的?
既然设置了这种指针就必然有它的用途^0^,那么
常指针是拿来做什么的呢?
答案是:保护数据不被修改。
当指针作为函数的形式参数时候并不一定要修改指针所指向的数据。例如,在调用一个求数组最大值的函数时候,
就不希望数组的值被修改发生变化,反而希望在函数中能够限制对数组元素的修改,这时候就可以用到常指针来达到目的。
(实际编程时候,代码量是非常的大,不设置常指针就有指针所指向内容被修改的风险,这是逻辑错误,编译器无法报错。)
③常指针的定义格式如下:
格式: const 数据类型名 * 指针名;
实例: const int * ptint;
④下面一段代码可以帮助你加深对常指针的用法:
const int* ptint=NULL; //常指针定义时候不一定要初始化
int a=10; //定义一个整形变量a
pting=&a; //将指针ptint指向a
*ptint=100; //错误用法,因为ptint是常指针,不能通过指针本身的引用来修改指针所指向的
//内容(指针ptint指向变量a)
a=100; //正确
int b=10;
ptint=&b; //正确
小结:常指针,不管指向的是变量还是常量,都别想通过我指针本身的引用来修改我指向的内容。
就像上述代码,变量a可以赋值成100(自己修改自己),但是不可以通过指针ptint来修改a的内容。
常指针,我保护我指向的内容,但我可以选择我要保护的人。如上述代码,ptint可以指向a,也可以指向b,
我指向谁就保护谁。
NO.2指针常量
①什么是指针常量?
指针常量:指针本身的内容是常量,不可以改变。
指针也是一种数据类型,只不过它存的是地址,所以说指针也有变量和常量之分,就像一个整型数据也有变量和常量之分。
整型常量一旦定义(定义时候必须初始化),就不能通过赋值再改变整型常量的内容。
同理,指针常量一旦定义(定义同时必须初始化),就不能通过赋值再改变指针所存的地址。
绕了一大圈子只想说明一个结论:指针常量只指向一个固定的地址,不能再指向其它地址。
(但指针指向的内容可以通过指的针本身的间接引用来改变。)
②指针常量的定义格式如下:
格式: 数据类型名 * const 指针名;
实例: int * const p;
③下面一段代码可以加深你对指针常量的理解:
//对比一下两个例子,其实道理都是一样的
const int a=10; //定义一个整型常量
a=100; //错误,因为a是常量
int b=10;
int c=10;
const int * p=&a; //(常量定义的时候即初始化)
p=&b; //错误,因为p是指针常量,只能指向a
*p=100; //正确
NO.3区分方法
其实按照名字就可以都出来:
const int * p;
常量 指针 ===============》常指针
int* const p;
指针 常量 ===============》指针常量
为了记住它们的区别,最好的方法就是多用啦。