020-C++中 const char *ptr和char* const ptr

/**
 * 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
----------

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值