标签: 指针

  • 对C中const修饰指针的使用和理解

    const用于定义常量类型,限定某些变量不允许修改。

    const修饰指针时的原则:先忽略掉类型说明符,离谁近就修饰谁。

    1. 常量指针

    常量指针:是指向常量的指针,指针指向地址中的内容是不可修改的,但是指针的指向是可以修改。

    定义方式,以下2种都可以:

    1. const dataType *ptrName;
    2. dataType const *ptrName;
    int a = 20;
    int b = 30;
    const int *ptr_i = &a;
    // *ptr_i = 30; // 报错:read-only variable is not assignable 只读变量不可赋值
    ptr_i = &b; // OK的

    指针指向的内容不可修改,即:*ptrName(解引用时)表示的值不修改。

    const修饰的是*ptr_i,所以不能修改的是就是 *ptr_i 的值。

    2. 常指针(指针常量)

    常指针:是指针类型的常量,即指针本身的值不可以修改,始终指向一个地址。因此常指针初始化需要给定一个地址值。但是指向地址的内容可以修改

    定义方式,以下方式都是可以的(必须要初始化设置值):

    1. dataType *const ptrName;
    2. const *dataType ptrName;
    int a = 20;
    int *const ptr1 = &a;
    //ptr1 = NULL; // 报错:cannot assign to variable 'ptr1' with const-qualified type 'int *const' 
    *ptr1 = 30; // OK的
    
    // 使用 typedef 定义一个别名
    typedef int * intp_t;
    int b = 30;
    const intp_t p2 = &b;
    p2 = &a; // 报错:表达式必须是可修改的左值

    指针本身的值不可以修改,ptr1的值是&a,不可以修改,指针指向地址的内容可以修改即*ptr1(解引用时)表示的值可以修改。

    const修饰的是ptr1,所以ptr1的值不能修改。

    通过 typedef 定义指针类型别名intp_t后,再使用const 修饰 intp_t 变量,修饰的是指针本身,即指针本身的指向不可以修改。

    3. 常指针&常量指针的复合使用

    int a = 30;
    const int *const ptr_a = &a; 

    指针的地址值和地址值的内容 都不可以修改。

    第一个const 修饰的是 *ptr_a,所以 *ptr_a 的值不能修改。

    第二个const 修饰的是 ptr_a,所以 ptr_a的值也不能修改。

    4. 其他

    const 常用于修饰函数的参数,防止函数内部修改外部变量。