C++中const char*、char const*、char * const三者的区别

目录
  • 一、const char *ptr;
  • 二、char const *ptr;
  • 三、char * const ptr;

C/C++ 中关于以下三种定义:

  • const char *ptr;
  • char const *ptr;
  • char * const ptr;

整理三者之间的区别与联系。

一、const char *ptr;

定义一个指向字符常量的指针,这里,ptr是一个指向 char* 类型的常量,所以不能用ptr来修改所指向的内容,换句话说,*ptr的值为const,不能修改。但是ptr的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对ptr而言,这个值是常量。实验如下:ptr指向str,而str不是const,可以直接通过str变量来修改str的值,但是确不能通过ptr指针来修改。

gcc编译报错信息:

注释掉16行ptr[0] = 's';运行正常,运行结果为:

hello world
gello world

另外还可以通过重新赋值给该指针来修改指针指向的值,如上代码中取消7、18行的注释,运行结果为:

hello world
good game!!

二、char const *ptr;

此种写法和const char *等价,大家可以自行实验验证。

三、char * const ptr;

定义一个指向字符的指针常数,即const指针,实验得知,不能修改ptr指针,但是可以修改该指针指向的内容。实验如下:

gcc报错信息:

注释掉17行代码运行正常,运行结果为:

hello world
sello world

  • 对于const char *s来说,const char*是指向常量的指针,而不是指针本身为常量,可以不被初始化.该指针可以指向常量也可以指向变量,只是从该指针的角度而言,它所指向的是常量。*s是不变的,s是可以改变的,const限定的*s。s被一个解引用运算符修饰,故s是个普通的指针,可以修改,但是s所指向的数据(即*s)由于const的修饰而不可通过指针s去修改。
  • char *const s声明(*const s),(*const s)是char类型的。s被一个解引用运算符和一个const关键词修饰,故s是个不可修改的指针,但可通过指针s去修改s所指向的数据(即*s)。
  • char const *s和const char *s是同一个意思。
  • 如果既不允许s被修改,也不允许s所指向的数据被修改,那么需要声明为const char * const s。

到此这篇关于C++中const char*、char const*、char * const三者的区别的文章就介绍到这了,更多相关const char*、char const*、char * const内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换

    复制代码 代码如下: #ifndef USE_H_      #define USE_H_ #include <iostream>      #include <windows.h>      #include <string>      using namespace std;      class CUser      {      public:          CUser();          virtual~ CUser();          char*

  • 基于Protobuf C++ serialize到char*的实现方法分析

    protobuf的Demo程序是 C++版本的protubuf有几种serialize和unSerialize的方法: 方法一: 官方demo程序采用的是 复制代码 代码如下: // Write the new address book back to disk. fstream output(argv[1], ios::out | ios::trunc | ios::binary); if (!address_book.SerializeToOstream(&output)) { cerr &l

  • C++程序中main(int argc, char *argv[])函数的参数意义

    在vs中编写C++程序时,可以往主函数里传递两个参数:main(int argc,char *argv[]).主函数不能被其它函数调用,在window操作系统下调用者是. 测试程序如下所示: #include "stdafx.h" #include "iostream" using namespace std; int main(int argc,char *argv[]) { int i; for (i = 0; i < argc; i++) { cout

  • C++中char*转换为LPCWSTR的解决方案

    前言 大家在学习或者使用Windows编程中,经常会碰到字符串之间的转换,char*转LPCWSTR也是其中一个比较常见的转换.下面就列出几种比较常用的转换方法.大家可以根据自己的需求选择相对应的方法,下面来一起学习学习吧. 1.通过MultiByteToWideChar函数转换 MultiByteToWideChar函数是将多字节转换为宽字节的一个API函数,它的原型如下: int MultiByteToWideChar( UINT CodePage, // code page DWORD d

  • C++中CString string char* char 之间的字符转换(多种方法)

    首先解释下三者的含义 CString 是一种很有用的数据类型.它们很大程度上简化了MFC中的许多操作(适用于MFC框架),使得MFC在做字符串操作的时候方便了很多.需要包含头文件#include <afx.h> C++是字符串,功能比较强大.要想使用标准C++中string类,必须要包含#include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件.Char * 专门用于指以'\0'为结束的字符串. 以下

  • C++中string转换为char*类型返回后乱码问题解决

    问题来源: 在写二叉树序列化与反序列化时发现序列化函数为char* Serialize1(TreeNode *root)  其函数返回类型为char*,但是我在实现的过程中为了更方便的操作添加字符串使用的是C++中string类型的变量,这就导致我最后得到的结果res是string类型,若是要返回需要转化为char *类型.而等我将string类型转为char*后返回在主函数中就成了乱码. 先直接说最后的解决办法: 第一种:定义一个char数组,数组长度为stringlength+1,将stri

  • 用C++实现strcpy(),返回一个char*类型的深入分析

    代码如下所示: 复制代码 代码如下: #include "stdafx.h"#include <string>#include <iostream>using namespace std;char* strcpy(char *src_str, char *dest_str){ char* dest = dest_str; if ((src_str == NULL)||(dest_str == NULL))  //检查指针有效性 {  throw "In

  • C++中const char*、char const*、char * const三者的区别

    目录 一.const char *ptr; 二.char const *ptr; 三.char * const ptr; C/C++ 中关于以下三种定义: const char *ptr; char const *ptr; char * const ptr; 整理三者之间的区别与联系. 一.const char *ptr; 定义一个指向字符常量的指针,这里,ptr是一个指向 char* 类型的常量,所以不能用ptr来修改所指向的内容,换句话说,*ptr的值为const,不能修改.但是ptr的声明

  • c++中临时变量不能作为非const的引用参数的方法

    试看下面的代码: #include <iostream> using namespace std; void f(int &a) { cout << "f(" << a << ") is being called" << endl; } void g(const int &a) { cout << "g(" << a << "

  • 区分java中String+String和String+char

    我们来考虑一个关于java中String的问题: "abc" + '/'和 "abc" + "/"的区别. 通过这个例子, 我们可以顺便练习一下JDK工具中javap的用法, 原问题是这样的: 把斜杠/当作字符或字符串有什么区别呢? 一个是当作基本数据类型char,一个是对象String.具体有什么区别呢? 当作字符效率会更高吗? String str = "abc" + '/'; 和 String str = "a

  • C++中char[]能修改char*却不行

    少扯淡没用的,直接上代码 int main(int argc, char *argv[]) { char p[74] = "abcefghijkmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm"; char *a = "abcefghijkmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm"; printf(&qu

  • java中int、double、char等变量的取值范围详析

    目录 1.java工具 2.代码简单框架 3.int 4.long 5.double 6.float 7.char 8.byte 9.short 10.总结 1.java工具 1.JDK:Java开发者工具,建议安装1.8版的. 2.IEDA:集成开发环境 2.代码简单框架 public为访问修饰限定符 class为类 HelloWorld为类的名称 public static void main(String[] args)相当于C语言的的main函数 System.out.println()

  • char str[] 与 char *str的区别详细解析

    复制代码 代码如下: char* get_str(void)  {      char str[] = {"abcd"};      return str;  } char str[] = {"abcd"};定义了一个局部字符数组,尽管是数组,但它是一个局部变量,返回它的地址肯定是一个已经释放了的空间的地址. 此函数返回的是内部一个局部字符数组str的地址,且函数调用完毕后 此数组被销毁,所以你返回的指针也就指向一块被销毁的内存,这种写法是错误的. 复制代码 代码如

  • 深入const int *p与int * const p的区别详解(常量指针与指向常量的指针)

    对于指针和常量,有以下三种形式都是正确的: 复制代码 代码如下: const char * myPtr = &char_A;//指向常量的指针char * const myPtr = &char_A;//常量的指针const char * const myPtr = &char_A;//指向常量的常量指针 下面依次对这三种类型进行介绍.因为*操作符是左操作符,左操作符的优先级是从右到左,对于1.常量指针(Constant Pointers) 复制代码 代码如下: int * con

  • 基于C语言char与unsigned char的区别介绍

    在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别. 首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-127~127,unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字. 在实际使用过程种有什么区别呢?主要是符号位,但是在普通的赋值,读写文

  • C语言char s[]和char* s的区别

    C语言指针可以代替数组使用 1.数组本质 数组是多个元素的集合,在内存中分布在地址连续的单元中,因此可以通过其下标访问数组的不同数组. 例如: 下面展示一些 char s[3] = "0x1"; printf("s2字符串:\n"); printf("%c\n", s[0]); printf("%c\n", s[1]); printf("%c\n", s[2]); 2.指针 指针也是一种变量,只不过它的内存

随机推荐