C语言-const char*,char const*,char *const理解

By: Ailson Jack
Date: 2022.12.04
个人博客:http://www.only2fire.com/
本文在我博客的地址是:http://www.only2fire.com/archives/150.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。

微信公众号:嵌入式那些事

1、const char *ptr

const char *ptr 表示的是指向常量的指针,不能通过该指针去修改指针所指向地址中的内容,但是可以修改该指针的指向。 可以通过其他普通指针对同样地址中的数据进行修改,测试例子如下:

/**
 * @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;
}

编译测试程序:

gcc test.c -o test.exe

在这里插入图片描述
gcc编译报错,提示对指向常量的指针的错误操作。

屏蔽23行的代码 ptr[0] = 'A';,重新编译,运行结果如下:

在这里插入图片描述

2、char const *ptr

char const *ptrconst char *ptr 等价。

3、char * const ptr

**char * const ptr 表示的是指针的指向不可以被修改,但是可以修改指针指向地址中的内容。**测试例子如下:

/**
 * @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;
}

编译测试程序:

gcc test.c -o test.exe

在这里插入图片描述
gcc编译报错,提示指针的指向不可以被修改。

屏蔽27行的代码 ptr = name;,重新编译,运行结果如下:

在这里插入图片描述

4、总结

const char *ptr 表示的是指向常量的指针,不能通过该指针去修改指针所指向地址中的内容,但是可以修改该指针的指向。

char const *ptrconst char *ptr 等价。

char * const ptr 表示的是指针的指向不可以被修改,但是可以修改指针指向地址中的内容。

const放在*号前表示修饰的是指针指向的对象,const放在*号后表示修饰的是指针本身。

根据上面章节的内容,下面的写法是什么意思应该比较简单吧:

const char * const ptr;

表示的是ptr指针的指向不可以被修改,ptr指针所指向地址中的内容不可以被修改。

欢迎关注博主的公众号(微信搜索公众号:嵌入式那些事),可以扫描下面的公众号二维码:

在这里插入图片描述
如果文中有什么问题欢迎指正,毕竟博主的水平有限。

如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^。

排版更好的内容见我博客的地址:http://www.only2fire.com/archives/150.html

注:转载请注明出处,谢谢!^_^

在C语言中,`const char*` 和 `char*` 是两种不同的指针类型,它们之间的转换需要特别注意**类型安全****编译器警告/错误**。 ### 一、基本概念 - `char *`: 指向可变字符的指针,可以通过该指针修改所指向的内容。 - `const char *`: 指向**常量字符**的指针,不能通过该指针修改内容(即 `*ptr = 'a';` 非法)。 > 注意:`const char*` 允许指向非常量或常量数据,但不允许你去改它。 --- ### 二、能否相互转换? #### ✅ 1. `char*` → `const char*`:✅ **可以隐式转换** 这是安全的,因为把“可修改”变成“只读访问”不会破坏数据。 ```c #include <stdio.h> int main() { char str[] = "Hello"; char *p1 = str; const char *p2 = p1; // 合法:隐式转换 printf("%s\n", p2); // 输出 Hello return 0; } ``` ✅ 安全,不需要强制类型转换。 --- #### ❌ 2. `const char*` → `char*`:❌ **不可以隐式转换** 这是不安全的!因为如果允许将指向常量字符串的指针赋给 `char*`,就可能尝试修改只读内存,导致未定义行为(如程序崩溃)。 ```c const char *p1 = "Hello"; // 字符串字面量存储在只读区 char *p2 = p1; // ❌ 错误!编译器会报 warning 或 error // *p2 = 'h'; // 如果允许,这里会导致运行时错误 ``` ⚠️ 编译器通常会给出警告或拒绝编译: ``` warning: initialization discards 'const' qualifier from pointer target type ``` ##### ⚠️ 强制转换虽然语法上可行,但危险! 你可以用 `(char*)` 强转绕过编译器检查: ```c const char *p1 = "Hello"; char *p2 = (char*)p1; // ✅ 语法通过(不推荐!) // *p2 = 'h'; // ❌ 运行时错误!修改了字符串字面量 ``` 📌 危险原因:`"Hello"` 是字符串字面量,位于只读内存段。试图修改它会导致 **未定义行为**(通常是 segmentation fault)。 但如果原始数据是可写的,比如数组: ```c const char message[] = "Hello"; // 数据在栈上,但被声明为 const char *p = (char*)message; // 可以强制转换 p[0] = 'h'; // ✅ 安全,因为 message 实际上是可修改的内存 printf("%s\n", message); // 输出 hello ``` 这种情况下虽然技术上可行,但仍违反了 `const` 的设计意图,属于“打破封装”,应避免。 --- ### 三、总结 | 转换方向 | 是否允许 | 是否安全 | 说明 | |----------------------|----------|----------|------| | `char*` → `const char*` | ✅ 是 | ✅ 安全 | 隐式转换,推荐做法 | | `const char*` → `char*` | ❌ 否(需强转) | ⚠️ 危险 | 编译器警告,可能导致崩溃 | --- ### 四、最佳实践建议 1. 尽量使用 `const char*` 接受字符串输入参数(提高安全性): ```c void print_string(const char *str) { printf("%s\n", str); } ``` 2. 不要随意对 `const` 指针进行强制类型转换来写入。 3. 若确实需要修改字符串,应复制一份: ```c const char *src = "Hello"; char *dst = malloc(strlen(src) + 1); strcpy(dst, src); dst[0] = 'h'; // 现在可以安全修改 ``` --- ### 五、相关问题解释 - `const char*` 中 `const` 修饰的是 `char`,也就是说内容不可变,但指针本身可以改变(除非写成 `const char* const`)。 - C++ 比 C 更严格,不允许 `const` 到非 `const` 的隐式转换,必须显式 `const_cast`(C++ 才有)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackailson

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值