以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;
}