Bootstrap

(持续更新中!!~)11、原来可以这样理解C语言_深入理解指针(4/8)const修饰指针

目录

 4. const修饰指针

4.1 const修饰变量

4.2 const修饰指针变量


 4. const修饰指针

4.1 const修饰变量

        变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。 但是如果我们希望⼀个变量加上⼀些限制,不能被修改,怎么做呢?这就是const的作⽤。

#include <stdio.h>

int main()
{
     int m = 0;
     m = 20;//m是可以修改的 
     const int n = 0;
     n = 20;//n是不能被修改的 
     return 0;
}

        上述代码中n是不能被修改的,其实n本质是变量,只不过被const修饰后,在语法上加了限制,只要我 们在代码中对n就⾏修改,就不符合语法规则,就报错,致使没法直接修改n。

        但是如果我们绕过n,使⽤n的地址,去修改n就能做到了,虽然这样做是在打破语法规则。

#include <stdio.h>

int main()
{
     const int n = 0;
     printf("n = %d\n", n);
     int*p = &n;
     *p = 20;
     printf("n = %d\n", n);
     return 0;
}    

输出结果:

88c049092cfc4ebcb782edf7d460d004.png

        我们可以看到这⾥⼀个确实修改了,但是我们还是要思考⼀下,为什么n要被const修饰呢?就是为了 不能被修改,如果p拿到n的地址就能修改n,这样就打破了const的限制,这是不合理的,所以应该让 p拿到n的地址也不能修改n,那接下来怎么做呢?

4.2 const修饰指针变量

        ⼀般来讲const修饰指针变量,可以放在*的左边,也可以放在*的右边,意义是不⼀样的。

int * p;//没有const修饰? 

int const * p;//const 放在*的左边做修饰 

int * const p;//const 放在*的右边做修饰 

我们看下⾯代码,来分析具体分析⼀下:

#include <stdio.h>

//代码1 - 测试⽆const修饰的情况 

void test1()
{
     int n = 10;
     int m = 20;
     int *p = &n;
     *p = 20;//ok?
     p = &m; //ok?
}


//代码2 - 测试const放在*的左边情况 

void test2()
{
     int n = 10;
     int m = 20;
     const int* p = &n;
     *p = 20;//ok?
     p = &m; //ok?

}


//代码3 - 测试const放在*的右边情况 

void test3()
{
     int n = 10;
     int m = 20;
     int * const p = &n;
     *p = 20; //ok?
     p = &m; //ok?

}

//代码4 - 测试*的左右两边都有const 

void test4()
{
     int n = 10;
     int m = 20;
     int const * const p = &n;
     *p = 20; //ok?
     p = &m; //ok?

}

int main()
{
     //测试⽆const修饰的情况 
     test1();
     //测试const放在*的左边情况 
     test2();
     //测试const放在*的右边情况 
     test3();
     //测试*的左右两边都有const 
     test4();
     return 0;
}

结论:const修饰指针变量的时候

• const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。 但是指针变量本⾝的内容可变。

• const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指 向的内容,可以通过指针改变。

;