const char*, char const*, char*const的区别
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) } int return; |
结论如下:
- 在foo函数中,可以使main函数中p指向的新的字符串常量。
- 在foo函数中,可以使main函数中的p指向NULL。
- 在foo函数中,可以使main函数中的p指向由malloc生成的内存块,并可以在main中用free释放,但是会有警告。但是注意,即使在foo中让p指向了由malloc生成的内存块,但是仍旧不能用p[1]='x';这样的语句改变p指向的内容。
- 在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的区别相关推荐
- cont char *p 和 char* const p 区别及记忆方法
/* cont char *p 和 char* const p 区别及记忆方法 const char *p = "hello"; 和 char const *p = "h ...
- 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 ...
- const char *p;和char * const p的区别
const char *p; const修饰*p,所以*p是一个常量,不可修改. char* const p; const修饰p,所以指针p是一个常量,不可修改. #include< ...
- 无法从“const char [10]”转换为“char *”
无法从"const char [10]"转换为"char *" 解决方法: 项目属性 c++--> 语言--> 符合模式->> 选择 ...
- C++中const char*, string 与char*的转化
C++中const char*, string 与char*的转化 原文:https://blog.csdn.net/zhang_alongzd/article/details/52790905 版权 ...
- 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 ...
- const char* p 、char* const p、const (char*) p 理解记忆
网上查找了很多理解记忆的方式,总结几个对自己理解很有帮助的原则: 1:从右至左理解(应该和c++的语言特性有关) 2:const修饰最近的一个单词,'*'除外.(还有一种理解const在'*'左,修饰 ...
- const char * array[]和char * const array[]
int main() {char abc[] = "abc";char def[] = "def";char * const array[] = {" ...
- 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 ...
- 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 ...
最新文章
- luogu P1549 棋盘问题(2) 题解
- Django从理论到实战(part19)--DTL模板语法
- linux笔记索引 QQFF-200305
- 潘石屹也要学编程了?Python之父:并非人人都需要了解计算机发生了什么
- 2020互联网岳麓峰会“软件再出发论坛”成功举办
- Codeforces Round #499 (Div. 2): F. Mars rover(DFS)
- codeforces 431 B Shower Line【暴力】
- 斑能不能彻底去掉_鸡脖、猪脖子上有淋巴结,会有大量毒素、病菌?还能不能放心吃?...
- tolua错误大全-Chinar出品-几乎可为新手解决所有报错情景
- 英语之形容词和副词规则
- 收藏一个w3school在线手册与php5在线手册
- 计算机在日常办公众的应用论文,计算机及应用基础专业论文.docx
- 一键修改手机DNS的bat文件
- 0x7c9300e8 0x7c9300e8错误
- unity-shader-基于图像的光照IBL
- 微生物恒化器中的进化压力----进化模型推导与分析
- JavaScript children和childNodes
- 使用xbox游戏手柄控制PX4的gazebo仿真
- CF 375C Circling Round Treasures(状态压缩+bfs)
- 第十六届全国大学生智能车竞赛线上全国总决赛裁判手册