常量指针、指针常量、常指针常量的区分和理解

以char类型为例,常见的指针定义有
const char* p
char const* p
char* const p
const char* const p
char const* const p


一、定义区分

Tips:可以通过忽略类型辅助记忆和区分

定义格式忽略类型
常量指针const char* p
char const* p
const * p
指针常量char* const p* const p
常指针常量const char* const p
char const* const p
const * const p

二、理解

首先,需要明确的是,对于char * p

  • p表示一个内存地址;
  • *p表示该地址中存放的内容 ,即值;
  • char则表示该值的类型为字符型;

原则:const修饰的值(地址或者值)不能被修改 所以,只要能区分const修饰的是哪个部分,就能知道具体不能被修改的内容。

2.1 常量指针(const * p)

指向常量的指针,格式如下:

const 类型 * p
类型 const * p
  • const在*之前,修饰的是指针所指向地址的内容(*p)
  • 指针指向地址的内容不能被修改,即不能通过常量指针修改其指向地址的内容,指向地址的内容固定
  • 可以修改指针的值,即可以将该指针指向其他地址
#include<iostream>
#include<cstring>
using namespace std;

/** 常量指针 */
int main()
{
	const char* str = "ABC";    // const修饰常量字符串
	printf("Address of str: %p\n\n", str);
	//*str = "abc";               // error,不能通过常量指针修改常量的值

	char const* str1 = "DEF";
	str = str1;                 // 可以将常量指针指向其他常量或者其他变量地址
	printf("Address of str: %p\n", str);
	printf("Address of str1: %p\n", str1);
	printf("Value of str: %s\n\n", str);

	char str2[] = "GHI";
	str = str2;
	str2[0] = 'I';
	printf("Address of str: %p\n", str);
	printf("Address of str2: %p\n", str2);
	printf("Value of str: %s\n\n", str);
	//str[0] = 'C';             // errror,不能通过常量指针修改常量的值

	system("pause");
	return 0;
}

在这里插入图片描述

2.2 指针常量(* const p)

指针本身是一个常量,格式如下:

类型 * const p
  • const在指针变量名(p)前,修饰指针本身,即指针指向的地址
  • 指针的值不能被修改,即指针所指向的地址不能变,指向固定地址
  • 指针是一个常量,其值不能修改,所以定义时 一定要初始化
  • 可以通过该指针常量修改其指向地址的值
#include<iostream>
#include<cstring>
using namespace std;

/** 指针常量 */
int main()
{
	char str[] = "abc";
	char* const ptr = str;       // 一定要赋初值,否则编译不通过
	printf("Address of str: %p\n", str);
	printf("Address of ptr: %p\n", ptr);
	printf("Value of ptr: %s\n\n", str);

	char str2[] = "def";
	//ptr = str2;                  // error,不能修改指针常量的值,即不能改变指针常量所指向的地址;

	ptr[0] = 'o';
	printf("Address of str2: %p\n", str2);
	printf("Address of ptr: %p\n", ptr);
	printf("Value of str2: %s\n", str);
	printf("Value of ptr: %s\n\n", ptr);

	system("pause");
	return 0;
}

在这里插入图片描述

2.3 常指针常量(const * const p)
一个指向常量的指针常量,格式如下:
const 类型 * const p
类型 const * const p 
  • 一个const修饰指针,一个const修饰指针指向地址的内容
  • 指向固定地址的固定内容,不能通过常指针常量修改指向地址的内容,也不能将该指针指向其他地址
  • 定义时需要初始化
#include<iostream>
#include<cstring>
using namespace std;


/** 常指针常量 */
int main()
{
	char str[] = "ABC";
	const char* const ptr = str;
	//ptr[0] = '0';     // error	

	const char* str1 = "abc";
	char const* const ptr1 = str1;

	char str2[] = "123";
	//ptr = str2;      // error

	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值