const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。

事实上这个概念谁都有,只是三种声明方式非常相似很容易记混。
Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:
把一个声明从右向左读。

char * const cp; ( * 读成 pointer to )
cp is a const pointer to char

const char * p;
p is a pointer to const char;

char const * p;
同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。

C++标准规定,const关键字放在类型或变量名之前等价的。

const int n=5;    //same as belowint const m=10;
const int *p;    //same as below  const (int) * pint const *q;    // (int) const *p
char ** p1; //    pointer to    pointer to    char const char **p2;//    pointer to    pointer to const char char * const * p3;//    pointer to const pointer to    char const char * const * p4;//    pointer to const pointer to const char char ** const p5;// const pointer to    pointer to    char const char ** const p6;// const pointer to    pointer to const char char * const * const p7;// const pointer to const pointer to    char const char * const * const p8;// const pointer to const pointer to const char

说到这里,我们可以看一道以前Google的笔试题:

[题目]const char *p="hello";
       foo(&p);//函数foo(const char **pp)
下面说法正确的是[]
A.函数foo()不能改变p指向的字符串内容
B.函数foo()不能使指针p指向malloc生成的地址
C.函数foo()可以使p指向新的字符串常量
D.函数foo()可以把p赋值为 NULL.

至于这道题的答案是众说纷纭。针对上面这道题,我们可以用下面的程序测试:

#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>

void foo(const char **pp)
{
//    *pp=NULL;
//    *pp="Hello world!";
        *pp = (char *) malloc(10);
        snprintf(*pp, 10, "hi google!");
//       (*pp)[1] = 'x';

}

int
main()
{
    const char *p="hello";
    printf("before foo %s/n",p);
    foo(&p);
    printf("after foo %s/n",p);
    p[1] = 'x';

return;
}

结论如下:

  1. 在foo函数中,可以使main函数中p指向的新的字符串常量。
  2. 在foo函数中,可以使main函数中的p指向NULL。
  3. 在foo函数中,可以使main函数中的p指向由malloc生成的内存块,并可以在main中用free释放,但是会有警告。但是注意,即使在foo中让p指向了由malloc生成的内存块,但是仍旧不能用p[1]='x';这样的语句改变p指向的内容。
  4. 在foo中,不能用(*pp)[1]='x';这样的语句改变p的内容。

所以,感觉gcc只是根据const的字面的意思对其作了限制,即对于const char*p这样的指针,不管后来p实际指向malloc的内存或者常量的内存,均不能用p[1]='x'这样的语句改变其内容。但是很奇怪,在foo里面,对p指向malloc的内存后,可以用snprintf之类的函数修改其内容。

const char*, char const*, char*const的区别相关推荐

  1. cont char *p 和 char* const p 区别及记忆方法

    /* cont char *p 和 char* const p 区别及记忆方法 const char *p = "hello"; 和 char const *p = "h ...

  2. const char *str,char const *str,char *const str的区别,及const详解

    c和c++中有三种定义: 1.const char *str, 2.char *const str, 3.char const *str. 现总结三者之间的区别: 一 char *const str ...

  3. const char *p;和char * const p的区别

    const char *p;       const修饰*p,所以*p是一个常量,不可修改. char* const p; const修饰p,所以指针p是一个常量,不可修改. #include< ...

  4. 无法从“const char [10]”转换为“char *”

    无法从"const char [10]"转换为"char *" 解决方法: 项目属性  c++--> 语言-->  符合模式->> 选择 ...

  5. C++中const char*, string 与char*的转化

    C++中const char*, string 与char*的转化 原文:https://blog.csdn.net/zhang_alongzd/article/details/52790905 版权 ...

  6. arm linux c++编译警告:ISO C++ forbids converting a string constant to ‘char*’(需要把const char*转换成char*)

    编译时遇到警告: /home/yg/rv/sdk/rv1.8/rv1126_rv1109/buildroot/output/rockchip_rv1126_rv1109/build/ky_ai_cam ...

  7. const char* p 、char* const p、const (char*) p 理解记忆

    网上查找了很多理解记忆的方式,总结几个对自己理解很有帮助的原则: 1:从右至左理解(应该和c++的语言特性有关) 2:const修饰最近的一个单词,'*'除外.(还有一种理解const在'*'左,修饰 ...

  8. const char * array[]和char * const array[]

    int main() {char abc[] = "abc";char def[] = "def";char * const array[] = {" ...

  9. cannot convert ‘LPCWSTR {aka const wchar_t*}‘ to ‘LPCSTR {aka const char*}‘ for argument ‘3‘

    复制别人的代码运行报错cannot convert 'LPCWSTR {aka const wchar_t*}' to 'LPCSTR {aka const char*}' for argument ...

  10. 2020-09-21C++学习笔记之与C语言区别和加强——四种const意义(const int a; int const b; const int *c; int * const d)

    2020-09-21C++学习笔记(const int a; int const b; const int *c; int * const d) 这两天在上课更新晚了. 1.C/C++中的const ...

最新文章

  1. luogu P1549 棋盘问题(2) 题解
  2. Django从理论到实战(part19)--DTL模板语法
  3. linux笔记索引 QQFF-200305
  4. 潘石屹也要学编程了?Python之父:并非人人都需要了解计算机发生了什么
  5. 2020互联网岳麓峰会“软件再出发论坛”成功举办
  6. Codeforces Round #499 (Div. 2): F. Mars rover(DFS)
  7. codeforces 431 B Shower Line【暴力】
  8. 斑能不能彻底去掉_鸡脖、猪脖子上有淋巴结,会有大量毒素、病菌?还能不能放心吃?...
  9. tolua错误大全-Chinar出品-几乎可为新手解决所有报错情景
  10. 英语之形容词和副词规则
  11. 收藏一个w3school在线手册与php5在线手册
  12. 计算机在日常办公众的应用论文,计算机及应用基础专业论文.docx
  13. 一键修改手机DNS的bat文件
  14. 0x7c9300e8 0x7c9300e8错误
  15. unity-shader-基于图像的光照IBL
  16. 微生物恒化器中的进化压力----进化模型推导与分析
  17. JavaScript children和childNodes
  18. 使用xbox游戏手柄控制PX4的gazebo仿真
  19. CF 375C Circling Round Treasures(状态压缩+bfs)
  20. 第十六届全国大学生智能车竞赛线上全国总决赛裁判手册

热门文章

  1. ETL工具KETTLE常用设计之——作业设计思路模板
  2. 万能密码或账号登录语句
  3. 主码,候选码,外码,全码,主属性,非主属性的区别
  4. 「次时代建模」次时代游戏模型制作教程
  5. linux pci/pcie驱动
  6. rtx2060什么水平_RTX2060性能如何?NVIDIA新一代RTX2060显卡评测
  7. Distiller量化学习(1)
  8. service层的意义
  9. 儿童编程培训都学什么
  10. win7系统突然变慢的解决方法