/**
* const pointer与 pointer to const
* 例子:
* char strHelloworld[] = {"helloworld"};
* char const *pStr1 = "helloworld"; // const char* pStr1 是一样的
* char* const pStr2 = "helloworld";
* char const* const pStr3 = "helloworld"; // const char* const
*
* pStr1 = strHelloworld;
* // pStr2 = strHelloworld; // pStr2 不可改
* // pStr3 = strHelloworld; // pStr3 不可改
*
* 关于const修饰的部分:关键在于看 const 是在 * 之前 还在 * 之后
* 如果 const 在 * 之前 则修饰的是内容,则内容不可动 指针指向可以动 ---> const char *ptr | char const *ptr
* 如果 const 在 * 之后 则修饰的是指针,则内容可动,指针指向不可动---> char* const ptr
*
*
**/
#include<iostream>
using namespace std;
const int MAX_LEN = 100;
int main(int argc, char const *argv[])
{
// const char* ptr 定义一个字符常量的指针,ptr是一个指向 char* 类型的常量
// 所以不能通过ptr来修改所指向的内容,*ptr的值是const, 不能修改。但是ptr的声明
// 并不意味者说是所指向的值就是一个常量,也可以不是常量,常量的概念是对于ptr来说的,
// 就是说字符数组可以是自己进行修改内容,但是通过你ptr不能
int i;
char str[] = "hello world";
char ss[] = "nice shot";
const char *ptr = str;
for (int i=0; i< strlen(str); i++){
cout<<ptr[i];
}
cout<<endl;
cout<<"----------"<<endl;
// ptr[0] = 's'; // 通过ptr修改报错
str[1] = 'o'; // 通过str修改正常
//ptr = ss; // 重新赋值ptr指针 指针所保存地址会发生
for (int i=0; i< strlen(str); i++){
cout<<ptr[i];
}
cout<<endl;
cout<<"----------"<<endl;
// char const *ptr <=> const char *ptr 两者等价
// char* const ptr
// 定义一个指向字符的指针常量,即const指针,不能修改ptr指针
// 但是可以修改该指针指向的内容
// 这个常量修饰的是指针,而 const char *ptr 修饰的内容
// 修饰的意思在这块可以理解成保护 保护的意思是说不要乱动
int k;
char strr[] = "hello world";
char sss[] = "game over";
char* const ptrr = strr;
for (int k =0; k< 11; k++){
cout<<ptrr[k];
}
cout<<endl;
cout<<"----------"<<endl;
ptrr[1] = 'k'; // 可以通过ptrr修改内容
//ptrr = sss; // 不可以修改指针指向
for (int k =0; k< 11; k++){
cout<<ptrr[k];
}
cout<<endl;
cout<<"----------"<<endl;
// const 在 * 之前 不能修改内容(即不能通过指针修改内容)
// const 在 * 之后 不能修改指针指向(即不能给指针重新赋值)
char const* const pStr3 = "game world";
//pStr3 = str; // 报错 不能修改指针的指向
//pStr3[0] = 'f'; // 报错 不能修改内容
return 0;
}
输出如下:
hello world
----------
hollo world
----------
hello world
----------
hkllo world
----------