三者的区分
简而言之~
常指针:地址不可变,内容可变
指向常量的指针:地址可变,内容不可变
指向常量的常指针:地址不可变,内容不可变
样例
代码如下:
#include <iostream>
using namespace std;
int main()
{
/************指向常量的常指针(把指针所指的地址声明为常量,所指向地址中存放的内容也不能改变)************/
const char *const name1="chen";//声明一个指针变量name1,name1指针指向"chen"字符串的首地址
/*
-------
name1【name[0]】--> | c |
-------
| h |
-------
| e |
-------
name1[3]--> | n |
-------
*/
name1[3]='a';//错误【name1为指针,指向”chen“字符串的首地址(相当于一个有一个数组name1,name1[3]即表示该数组中下标为3的元素)】
name1="lin";//错误【该语句表示,将该指针改为指向”lin“字符串的首地址,错误】
name1=new char[5];//错误【该语句表示,new一个char型数组,将该指针改为指向该char型数组的首地址,错误】
cout<<name1[3]<<endl;//正确,输出字符n
/************常指针(把指针所指的地址声明为常量,所指向地址中存放的内容可以改变)************/
//声明一个指针变量name2,该指针为指向字符型数据的常指针,用“chen”字符串的存储地址初始化该指针
char *const name2="abcd";
cout<<name2<<endl;
name2[3]='q';//正确(地址为常量,该地址内存储的内容可以改变)
name2="lin";//错误(地址不可变)
name2=new char[5];//错误(该语句表示创建一个char型数组,将该数组的首地址赋值name2指针,即使指针指向char[5]数组的首地址,地址不可变,因此该语句错误)
name2=new char('q');//错误(该语句表示new一个char型变量,并初始化该变量为q,将name2指针指向该char型变量的地址,错误)
/************指向常量的指针(指针所指的地址可以改变,所指向地址中存放的内容不能改变)************/
const char *name3="because";
char x='p';
char y[9]="dgaogd";
name3[2]='s';//错误【存储内容不可改变】
name3=&x;//正确【地址可以改变】
name3=y;//正确【地址可以改变】
name3=y[3];//错误【内容不可变】
}