8、指针 + const

判断 const 修饰的是指针还是内容

1. const char *pchar const *p

这两种声明是等价的,表示指针指向的内容是常量。通过分析 const 关键字的位置,可以确定 const 修饰的是指针指向的内容。

  • const char *pconst 修饰的是 char,即 p 指向的内容。
  • char const *pconst 修饰的是 char,即 p 指向的内容。

示例代码:

#include <stdio.h>

int main() {
    const char *p1 = "Hello"; // 等价于 char const *p1
    char const *p2 = "World";

    // 不能通过指针 p1 和 p2 修改指向的内容
    // *p1 = 'h'; // 错误:不能修改 p1 指向内容的值
    // *p2 = 'w'; // 错误:不能修改 p2 指向内容的值

    // 可以改变指针 p1 和 p2 本身的值
    p1 = "New Hello";
    p2 = "New World";

    printf("p1: %s\n", p1);
    printf("p2: %s\n", p2);

    return 0;
}

// 输出结果:
// p1: New Hello
// p2: New World

2. char *const p

表示指针本身是常量,不能改变指针的值,但可以通过指针修改指向的内容。通过 const 关键字的位置,可以确定 const 修饰的是指针本身。

  • char *const pconst 修饰的是指针 p 本身。

示例代码:

#include <stdio.h>

int main() {
    char str[] = "Hello";
    char *const p = str;

    // 可以通过指针 p 修改指向的内容
    *p = 'h';

    // 不能改变指针 p 本身的值
    // p = "New Hello"; // 错误:不能改变指针 p 本身

    printf("p: %s\n", p);

    return 0;
}

// 输出结果:
// p: hello

3. const char *const p

表示指针本身和指针指向的内容都是常量。通过 const 关键字的位置,可以确定 const 修饰的是指针本身和指针指向的内容。

  • const char *const p:第一个 const 修饰指向的内容,第二个 const 修饰指针本身。

示例代码:

#include <stdio.h>

int main() {
    const char *const p = "Hello";

    // 不能通过指针 p 修改指向的内容
    // *p = 'h'; // 错误:不能修改 p 指向内容的值

    // 不能改变指针 p 本身的值
    // p = "New Hello"; // 错误:不能改变指针 p 本身

    printf("p: %s\n", p);

    return 0;
}

// 输出结果:
// p: Hello

4. char *p const

这种声明在C语言中是无效的,因为 const 不能修饰指针之后。指针的常量属性必须在指针名称之前声明。

// 错误示例:
// char *p const;
// 编译错误:在C语言中,不允许这种声明。

判断方法总结

  • const* 之前:表示指针指向的内容是常量,不能通过指针修改内容,但可以改变指针本身。
    • 示例:const char *pchar const *p
  • const* 之后:表示指针本身是常量,不能改变指针的值,但可以通过指针修改指向的内容。
    • 示例:char *const p
  • 两个 const:第一个 const 修饰指向的内容,第二个 const 修饰指针本身,指针和指向的内容都是常量。
    • 示例:const char *const p
指针const修饰符的组合可以用于以下三种情况: 1. 指向常量的非常量指针:使用const修饰指针所指向的对象,表示该对象为常量,但指针本身可以修改。 ```cpp const int* p; // 指向常量int的非常量指针 ``` 在上述示例中,p是一个指向常量int的非常量指针。这意味着p所指向的int对象是常量,不能通过p来修改该对象的值,但p本身可以指向其他int对象。 2. 指向非常量的常量指针:使用const修饰指针本身,表示指针本身是常量,但指针所指向的对象可以修改。 ```cpp int* const p; // 指向非常量int的常量指针 ``` 在上述示例中,p是一个指向非常量int的常量指针。这意味着p可以用来修改所指向的int对象的值,但p不能重新指向其他int对象。 3. 指向常量的常量指针:同时使用const修饰指针本身和指针所指向的对象,表示指针本身和所指向的对象都是常量。 ```cpp const int* const p; // 指向常量int的常量指针 ``` 在上述示例中,p是一个指向常量int的常量指针。这意味着p所指向的int对象是常量,不能通过p来修改该对象的值,同时p本身也不能重新指向其他int对象。 需要注意的是,在这些情况下,const修饰符可以放在*之前或之后,效果是相同的。例如,const int* p和int const* p都表示指向常量的非常量指针。而int* const p表示指向非常量的常量指针。 总结起来,指针const修饰符的组合可以用于灵活地控制指针和所指向对象的可修改性和常量性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值