前言
char = greeting[] = "Hello";
char *p = greeting; //non-const pointer,non-const data
const char *p = greeting; //non-const pointer,const data
char *const p = greeting; //const pointer,non-const data
const char *const p = greeting; //const pointer,const data
一、const char *ptr (字符常量的指针)
1、定义说明
- const char *ptr是定义一个指向字符常量的指针;
- ptr是一个指向char*类型的常量,所以不能用ptr来修改其所指向的内容。换句话说,*ptr的值为const,不能修改。
- ptr的声明并不意味着它指向的值就是一个常量,而只是意味着对ptr而言,它指向的这个值是常量。具体请参考下面的实例。
2、实例说明
(1)实例1:
- 定义一个指向字符常量的指针ptr,使ptr指向str(对于ptr而言,他认为他指向的这个值是常量),但是str不是const。因此我们可以直接通过str变量来修改str的值,进而改变了ptr指向的值。但是不能使用ptr来修改ptr指向的值。
#include<iostream>
using namespace std;
int main()
{
int i;
char str[] = "hello world!"; //非const
const char *ptr = str; //定义一个指向字符常量的指针
str[0] = 'a'; //使用str变量来修改str的值,进而改变ptr指向的内容
for (int i = 0; i < 12; i++)
cout << ptr[i];
system("pause");
return 0;
}
- 如果使用ptr修改指向内容就会出错
#include<iostream>
using namespace std;
int main()
{
int i;
char str[] = "hello world!"; //非const
const char *ptr = str; //定义一个指向字符常量的指针
ptr[0] = 'a'; //这样写就会报错
for (int i = 0; i < 12; i++)
cout << ptr[i];
system("pause");
return 0;
}
(2)实例2:
- 重新赋值给该指针来修改该指针所指向的值,即可以让该指针指向其他“字符常量”
#include<iostream>
using namespace std;
int main()
{
int i;
char str[] = "hello world!"; //非const
char ss[] = "good game!";
const char *ptr = str; //定义一个指向字符常量的指针
ptr = ss; //重新赋值ptr指针
for (int i = 0; i < 10; i++)
cout << ptr[i];
system("pause");
return 0;
}
二、char const *ptr
因为没有const *的运算,如出现const *的形式,则const实际是修饰前面的,因此char const *ptr和const char *ptr等价
三、char *const ptr
1、定义说明
- char *const ptr是定义一个指向字符的指针常量,即const指针,不能修改ptr指针的指向,但可以修改该指针指向的内容(即在指向字符不变的情况下对字符的内容进行修改,不能指向另一个字符)
2、实例说明
- 通过ptr修改指针指向的内容
#include<iostream>
using namespace std;
int main()
{
int i;
char str[] = "hello world!"; //非const
char *const ptr = str; //定义一个指向字符常量的指针
ptr[0] = 'a';
for (int i = 0; i < 12; i++)
cout << ptr[i];
system("pause");
return 0;
}
- 通过str修改指针指向的内容
#include<iostream>
using namespace std;
int main()
{
int i;
char str[] = "hello world!"; //非const
char *const ptr = str; //定义一个指向字符常量的指针
str[0] = 'a';
for (int i = 0; i < 12; i++)
cout << ptr[i];
system("pause");
return 0;
}
- 不能修改ptr指针的指向,会报错
#include<iostream>
using namespace std;
int main()
{
int i;
char str[] = "hello world!"; //非const
char ss[] = "good game!";
char *const ptr = str; //定义一个指向字符常量的指针
ptr = ss;
for (int i = 0; i < 12; i++)
cout << ptr[i];
system("pause");
return 0;
}
四、const char *const p 和 char const *const p
1、定义说明
- 两者一样,定义一个指向常量字符的指针常量,即内容和指针都不能改变
2、实例说明
- 改变指针
#include<iostream>
using namespace std;
int main()
{
int i;
char str[] = "hello world!"; //非const
char ss[] = "good game!";
const char *const ptr = str; //定义一个指向字符常量的指针
ptr = ss;
for (int i = 0; i < 12; i++)
cout << ptr[i];
system("pause");
return 0;
}
- 改变内容
#include<iostream>
using namespace std;
int main()
{
int i;
char str[] = "hello world!"; //非const
const char *const ptr = str; //定义一个指向字符常量的指针
ptr[0] = 'a';
for (int i = 0; i < 12; i++)
cout << ptr[i];
system("pause");
return 0;
}
五、总结
- 如果const关键字出现在星号(*)左边,则表示被指物是常量;
- 如果const关键字出现在星号(*)右边,则表示指针自身是常量;
- 如果const关键字出现在星号(*)两边,表示被指物和指针两者都是常量。