const char*, char const*, char*const 的区别 - 菜鸟教程

文章推薦指數: 80 %
投票人數:10人

Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:把一个声明从右向左读。

char * const cp; ( * 读成pointer to ) cp is a const pointer to char ... 菜鸟教程--学的不仅是技术,更是梦想! 首页 笔记首页 Android ES6教程 排序算法 Hadoop Zookeeper Verilog 编程技术 程序员人生 首页 Android ES6 逗乐 Search constchar*,charconst*,char*const的区别 分类编程技术 Bjarne在他的TheC++ProgrammingLanguage里面给出过一个助记的方法:把一个声明从右向左读。

char*constcp;(*读成pointerto) cpisaconstpointertochar constchar*p; pisapointertoconstchar; charconst*p; 同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。

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

constintn=5;//sameasbelow intconstm=10; constint*p;//sameasbelowconst(int)*p intconst*q;//(int)const*p char**p1; //pointertopointertochar constchar**p2; //pointertopointertoconstchar char*const*p3; //pointertoconstpointertochar constchar*const*p4; //pointertoconstpointertoconstchar char**constp5; //constpointertopointertochar constchar**constp6; //constpointertopointertoconstchar char*const*constp7; //constpointertoconstpointertochar constchar*const*constp8; //constpointertoconstpointertoconstchar 说到这里,我们可以看一道以前Google的笔试题: constchar*p="hello";       foo(&p);//函数foo(constchar**pp)下面说法正确的是[] A.函数foo()不能改变p指向的字符串内容。

B.函数foo()不能使指针p指向malloc生成的地址。

C.函数foo()可以使p指向新的字符串常量。

D.函数foo()可以把p赋值为NULL。

至于这道题的答案是众说纷纭。

针对上面这道题,我们可以用下面的程序测试: #include #include #include voidfoo(constchar**pp) { //   *pp=NULL; //   *pp="Helloworld!";        *pp=(char*)malloc(10);        snprintf(*pp,10,"higoogle!"); //      (*pp)[1]='x'; } int main() {    constchar*p="hello";    printf("beforefoo%s/n",p);    foo(&p);    printf("afterfoo%s/n",p);    p[1]='x';    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的字面的意思对其作了限制,即对于constchar*p这样的指针,不管后来p实际指向malloc的内存或者常量的内存,均不能用p[1]='x'这样的语句改变其内容。

但是很奇怪,在foo里面,对p指向malloc的内存后,可以用snprintf之类的函数修改其内容。

←Python中下划线的5种含义 Composer安装与使用→ 点我分享笔记 取消 分享笔记 昵称昵称(必填) 邮箱邮箱(必填) 引用地址引用地址 教程列表 ADO教程 Ajax教程 Android教程 Angular2教程 AngularJS教程 AppML教程 ASP教程 ASP.NET教程 Bootstrap教程 Bootstrap4教程 Bootstrap5教程 C教程 C#教程 C++教程 CSS参考手册 CSS教程 CSS3教程 Django教程 Docker教程 DTD教程 ECharts教程 Eclipse教程 Firebug教程 FontAwesome图标 Foundation教程 Git教程 Go语言教程 Google地图API教程 Highcharts教程 HTMLDOM教程 HTML参考手册 HTML字符集 HTML教程 HTTP教程 ionic教程 iOS教程 Java教程 JavaScript参考手册 Javascript教程 jQueryEasyUI教程 jQueryMobile教程 jQueryUI教程 jQuery教程 JSON教程 JSP教程 Julia教程 Kotlin教程 Linux教程 Lua教程 Markdown教程 Matplotlib教程 Maven教程 Memcached教程 MongoDB教程 MySQL教程 Node.js教程 NumPy教程 Pandas教程 Perl教程 PHP教程 PostgreSQL教程 Python3教程 Python基础教程 R教程 RDF教程 React教程 Redis教程 RSS教程 Ruby教程 Rust教程 Sass教程 Scala教程 SciPy教程 Servlet教程 SOAP教程 SQL教程 SQLite教程 SVG教程 SVN教程 Swift教程 TCP/IP教程 TypeScript教程 VBScript教程 Vue.js教程 Vue3教程 W3C教程 WebService教程 WSDL教程 XLink教程 XMLDOM教程 XMLSchema教程 XML教程 XPath教程 XQuery教程 XSLFO教程 XSLT教程 数据结构 正则表达式 测验 浏览器 网站品质 网站建设指南 网站服务器教程 设计模式 在线实例 ·HTML实例 ·CSS实例 ·JavaScript实例 ·Ajax实例 ·jQuery实例 ·XML实例 ·Java实例 字符集&工具 ·HTML字符集设置 ·HTMLASCII字符集 ·JS混淆/加密 ·PNG/JPEG图片压缩 ·HTML拾色器 ·JSON格式化工具 ·随机数生成器 最新更新 · 如何判断JavaSc... · JavaScriptNumb... · JavaScriptNumb... · JavaScriptNumb... · JavaScriptNumb... · jQuery判断元素... · JavaScript删除... 站点信息 · 意见反馈 · 免责声明 · 关于我们 · 文章归档 关注微信 Copyright©2013-2022菜鸟教程  runoob.comAllRightsReserved.备案号:闽ICP备15012807号-1 微信关注



請為這篇文章評分?