C语言-const char*,char const*,char *const理解
 2022.12.04    |      C/C++    |     AilsonJack    |     暂无评论    |     207 views
By: Ailson Jack
Date: 2022-12-04
个人博客: http://www.only2fire.com/
<p class="artical_littlestyle1">1、const char *ptr</p><p style="text-indent: 2em;"><strong>const char *ptr 表示的是指向常量的指针,不能通过该指针去修改指针所指向地址中的内容,但是可以修改该指针的指向。</strong> 可以通过其他普通指针对同样地址中的数据进行修改,测试例子如下:</p><pre class="brush:cpp;toolbar:false PrismJs">/** &nbsp;*&nbsp;@file&nbsp;test.c &nbsp;*&nbsp;@author&nbsp;Ailson&nbsp;Jack&nbsp;(jackailson@foxmail.com) &nbsp;*&nbsp;@brief &nbsp;*&nbsp;@version&nbsp;1.0 &nbsp;*&nbsp;@date&nbsp;2022-12-04 &nbsp;* &nbsp;*&nbsp;@copyright&nbsp;Copyright&nbsp;(c)&nbsp;2022 &nbsp;* &nbsp;*/ #include&nbsp;&lt;stdio.h&gt; int&nbsp;main(void) { &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;str[]&nbsp;=&nbsp;&quot;Hello&nbsp;World!&quot;; &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;name[]&nbsp;=&nbsp;&quot;Ailson&nbsp;Jack&quot;; &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;char&nbsp;*ptr&nbsp;=&nbsp;str; &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*ptr_tmp&nbsp;=&nbsp;str; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;修改指针所指向地址中的内容 &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;old&nbsp;str:%s\r\n&quot;,&nbsp;str); &nbsp;&nbsp;&nbsp;&nbsp;ptr[0]&nbsp;=&nbsp;&#39;A&#39;;&nbsp;//&nbsp;编译报错,不能通过该指针去修改指针所指向地址中的内容 &nbsp;&nbsp;&nbsp;&nbsp;ptr_tmp[0]&nbsp;=&nbsp;&#39;J&#39;;&nbsp;//&nbsp;其他普通指针对同样地址中的数据进行修改 &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;new&nbsp;str:%s\r\n&quot;,&nbsp;str); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;修改指针的指向 &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;old&nbsp;ptr:%s\r\n&quot;,&nbsp;ptr); &nbsp;&nbsp;&nbsp;&nbsp;ptr&nbsp;=&nbsp;name;&nbsp;//&nbsp;可以修改该指针的指向 &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;new&nbsp;ptr:%s\r\n&quot;,&nbsp;ptr); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; }</pre><p style="text-indent: 2em;">编译测试程序:</p><pre class="brush:bash;toolbar:false PrismJs">gcc&nbsp;test.c&nbsp;-o&nbsp;test.exe</pre><p style="text-align:center"><img src="/uploads/AilsonJack/2022.12.04/171830535816820.png" onclick="preview_image(&#39;/uploads/AilsonJack/2022.12.04/171830535816820.png&#39;)"/></p><p style="text-indent: 2em;">gcc编译报错,提示对指向常量的指针的错误操作。</p><p style="text-indent: 2em;">屏蔽23行的代码 ptr[0] = &#39;A&#39;;,重新编译,运行结果如下:</p><p style="text-align:center"><img src="/uploads/AilsonJack/2022.12.04/171830909214593.png" onclick="preview_image(&#39;/uploads/AilsonJack/2022.12.04/171830909214593.png&#39;)"/></p><p class="artical_littlestyle2">2、char const *ptr</p><p style="text-indent: 2em;"><strong>char const *ptr 和 const char *ptr 等价。</strong></p><p class="artical_littlestyle3">3、char * const ptr</p><p style="text-indent: 2em;"><strong>char * const ptr 表示的是指针的指向不可以被修改,但是可以修改指针指向地址中的内容。</strong>测试例子如下:</p><pre class="brush:cpp;toolbar:false PrismJs">/** &nbsp;*&nbsp;@file&nbsp;test.c &nbsp;*&nbsp;@author&nbsp;Ailson&nbsp;Jack&nbsp;(jackailson@foxmail.com) &nbsp;*&nbsp;@brief &nbsp;*&nbsp;@version&nbsp;1.0 &nbsp;*&nbsp;@date&nbsp;2022-12-04 &nbsp;* &nbsp;*&nbsp;@copyright&nbsp;Copyright&nbsp;(c)&nbsp;2022 &nbsp;* &nbsp;*/ #include&nbsp;&lt;stdio.h&gt; int&nbsp;main(void) { &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;str[]&nbsp;=&nbsp;&quot;Hello&nbsp;World!&quot;; &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;name[]&nbsp;=&nbsp;&quot;Ailson&nbsp;Jack&quot;; &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*&nbsp;const&nbsp;ptr&nbsp;=&nbsp;str; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;修改指针所指向地址中的内容 &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;old&nbsp;str:%s\r\n&quot;,&nbsp;str); &nbsp;&nbsp;&nbsp;&nbsp;ptr[0]&nbsp;=&nbsp;&#39;A&#39;;&nbsp;//&nbsp;可以修改指针指向地址中的内容 &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;new&nbsp;str:%s\r\n&quot;,&nbsp;str); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;修改指针的指向 &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;old&nbsp;ptr:%s\r\n&quot;,&nbsp;ptr); &nbsp;&nbsp;&nbsp;&nbsp;ptr&nbsp;=&nbsp;name;&nbsp;//&nbsp;编译报错,指针的指向不可以被修改 &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;new&nbsp;ptr:%s\r\n&quot;,&nbsp;ptr); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; }</pre><p style="text-indent: 2em;">编译测试程序:</p><pre class="brush:bash;toolbar:false PrismJs">gcc&nbsp;test.c&nbsp;-o&nbsp;test.exe</pre><p style="text-align:center"><img src="/uploads/AilsonJack/2022.12.04/171830379005230.png" onclick="preview_image(&#39;/uploads/AilsonJack/2022.12.04/171830379005230.png&#39;)"/></p><p style="text-indent: 2em;">gcc编译报错,提示指针的指向不可以被修改。</p><p style="text-indent: 2em;">屏蔽27行的代码 ptr = name;,重新编译,运行结果如下:</p><p style="text-align:center"><img src="/uploads/AilsonJack/2022.12.04/171830149876557.png" onclick="preview_image(&#39;/uploads/AilsonJack/2022.12.04/171830149876557.png&#39;)"/></p><p class="artical_littlestyle4">4、总结</p><p style="text-indent: 2em;"><strong>const char *ptr 表示的是指向常量的指针,不能通过该指针去修改指针所指向地址中的内容,但是可以修改该指针的指向。</strong></p><p style="text-indent: 2em;"><strong>char const *ptr 和 const char *ptr 等价。</strong></p><p style="text-indent: 2em;"><strong>char * const ptr 表示的是指针的指向不可以被修改,但是可以修改指针指向地址中的内容。</strong></p><p style="text-indent: 2em;">const放在*号前表示修饰的是指针指向的对象,const放在*号后表示修饰的是指针本身。</p><p style="text-indent: 2em;">根据上面章节的内容,下面的写法是什么意思应该比较简单吧:</p><pre class="brush:cpp;toolbar:false PrismJs">const&nbsp;char&nbsp;*&nbsp;const&nbsp;ptr;</pre><p style="text-indent: 2em;">表示的是ptr指针的指向不可以被修改,ptr指针所指向地址中的内容不可以被修改。<br/></p>
欢迎关注博主的公众号呀,精彩内容随时掌握:
热情邀请仔细浏览下博客中的广告,万一有对自己有用或感兴趣的呢。◕ᴗ◕。。
如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^,当然了能够赞赏博主,那就非常感谢啦!
注: 转载请注明出处,谢谢!^_^
暂无评论,要不要来个沙发
发表评论

 
Copyright © 2015~2023  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号