C语言-const char*,char const*,char *const理解
<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">/**
* @file test.c
* @author Ailson Jack (jackailson@foxmail.com)
* @brief
* @version 1.0
* @date 2022-12-04
*
* @copyright Copyright (c) 2022
*
*/
#include <stdio.h>
int main(void)
{
char str[] = "Hello World!";
char name[] = "Ailson Jack";
const char *ptr = str;
char *ptr_tmp = str;
// 修改指针所指向地址中的内容
printf("old str:%s\r\n", str);
ptr[0] = 'A'; // 编译报错,不能通过该指针去修改指针所指向地址中的内容
ptr_tmp[0] = 'J'; // 其他普通指针对同样地址中的数据进行修改
printf("new str:%s\r\n", str);
// 修改指针的指向
printf("old ptr:%s\r\n", ptr);
ptr = name; // 可以修改该指针的指向
printf("new ptr:%s\r\n", ptr);
return 0;
}</pre><p style="text-indent: 2em;">编译测试程序:</p><pre class="brush:bash;toolbar:false PrismJs">gcc test.c -o test.exe</pre><p style="text-align:center"><img src="/uploads/AilsonJack/2022.12.04/171830535816820.png" onclick="preview_image('/uploads/AilsonJack/2022.12.04/171830535816820.png')"/></p><p style="text-indent: 2em;">gcc编译报错,提示对指向常量的指针的错误操作。</p><p style="text-indent: 2em;">屏蔽23行的代码 ptr[0] = 'A';,重新编译,运行结果如下:</p><p style="text-align:center"><img src="/uploads/AilsonJack/2022.12.04/171830909214593.png" onclick="preview_image('/uploads/AilsonJack/2022.12.04/171830909214593.png')"/></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">/**
* @file test.c
* @author Ailson Jack (jackailson@foxmail.com)
* @brief
* @version 1.0
* @date 2022-12-04
*
* @copyright Copyright (c) 2022
*
*/
#include <stdio.h>
int main(void)
{
char str[] = "Hello World!";
char name[] = "Ailson Jack";
char * const ptr = str;
// 修改指针所指向地址中的内容
printf("old str:%s\r\n", str);
ptr[0] = 'A'; // 可以修改指针指向地址中的内容
printf("new str:%s\r\n", str);
// 修改指针的指向
printf("old ptr:%s\r\n", ptr);
ptr = name; // 编译报错,指针的指向不可以被修改
printf("new ptr:%s\r\n", ptr);
return 0;
}</pre><p style="text-indent: 2em;">编译测试程序:</p><pre class="brush:bash;toolbar:false PrismJs">gcc test.c -o test.exe</pre><p style="text-align:center"><img src="/uploads/AilsonJack/2022.12.04/171830379005230.png" onclick="preview_image('/uploads/AilsonJack/2022.12.04/171830379005230.png')"/></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('/uploads/AilsonJack/2022.12.04/171830149876557.png')"/></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 char * const ptr;</pre><p style="text-indent: 2em;">表示的是ptr指针的指向不可以被修改,ptr指针所指向地址中的内容不可以被修改。<br/></p>
暂无评论,要不要来个沙发
发表评论
JLink V9掉固件修复(灯不亮) 3Zephyr笔记2 - 在STM32F429上运行HelloWorld 2计算NandFlash要传入的行地址和列地址 1Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式 0Linux MMC子系统 - 5.eMMC 5.1工作模式-引导模式 0Linux MMC子系统 - 4.eMMC 5.1常用命令说明(2) 0
标签云
Linux嵌入式实用技巧ARM内核学习问题集合CC++编程语言阅读笔记汇编Linux内核完全注释Windows驱动开发计算机基础ARM11ARMv7-ASTM32IDESublimeLinux内核学习eMMCMMC子系统Ubuntu操作系统OfficeVMWareAPUEgccRTOS中断漫游世界随笔感悟开发工具软件应用编程VsCodearmccarmclang编译器ZephyrSPIJLink网卡驱动安装各种芯片库函数NFSμCOS内核sambaFlashUnix命令与脚本输入法Linux内核设计与实现gitRIFFWAVJATGFTPar8161安装centos有线上网μCGUI字库工程建立右键菜单网络文件系统Firefox百度NTFS文件系统CodeBlocksCentOS数据结构算法PhotoShop51KeilQTUltraEditscanfglibc宏定义UIDGID优先级娱乐天地SourceInsight磁盘扇区总线I2CPDFBComparePythonI2SFPUMakefileSWDCPUARP软件推荐FileZilla