常指针、指向常量的指针、指向常量的常指针

三者的区分

简而言之~

常指针:地址不可变,内容可变

指向常量的指针:地址可变,内容不可变

指向常量的常指针:地址不可变,内容不可变

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

样例

在这里插入图片描述

代码如下:

#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];//错误【内容不可变】
}

发布了8 篇原创文章 · 获赞 0 · 访问量 176

猜你喜欢

转载自blog.csdn.net/qq_44455289/article/details/103716408