const 修饰的一级指针和二级指针

一、const修饰的一级指针(关于指针的简要介绍在这里,建议在阅读本篇博客前浏览一下点击打开链接

       const int * p   int const * p  
       int * const

被const修饰的符号,我们称为常变量(具有常量的属性),c++中就是常量。例如:


   const int a = 10;
我们定义了一个常变量整形a,整形a具有那些特征呢?
你只能使用a给别的变量赋值,但切记不能给a进行赋值,编译器认为a的内存是不能修改的,因此试图给a的赋值操作都会失败,编译阶段都不会通过



1.const int * p 和 int *const p的区别(关键const修饰谁

 const只修饰离他最近的类型符号 
以下探讨一下 const int * p 修饰的是谁:


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
 int a = 10;
 int b = 20;
 const int * p = &a;
 //*p = 30;//error:表达式必须是可修改的左值
 p = &b;//ok
 printf("%d ", *p);//20
 system("pause");
 return 0;
}

证明出 const int * p 中const 修饰的是 int ,则 const int * P指的是: *p所代表的整形值是 常量不能被直接修改,而 指针 p本身是 变量可以被修改。(不能通过修改p指针指向地址a的数据来修改*p的值,但可以通过修改p指针本省所储存的地址来修改*p的值。)
另外
  const int * p 和 int const * p 是一样的,因为与int const * p 中与const相邻的类型只有int,const修饰的还是int。  

以下探讨一下 int *const p 修饰的是谁:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
 int a = 10;
 int b = 20;
 int *const p = &a;
 *p = 30;//ok
 //p = &b;//error:表达式必须是可修改的左值
 printf("%d ", *p);//20
 system("pause");
 return 0;
}

可以看出,int *const p 中const修饰的是int *,int *const p 指的是:指针p本身是常量不能被修改。而*p所代表拍的是整形变量可以被直接修改。(指针p本身存储的地址不能被修改,而指针p指向地址a的值可以被修改。)




二、const修饰的二级指针
       const int ** p
       int ** const p
       int * const * p
 相必看完上面const修饰的一级指针,上面const修饰的二级指针前两个 const int ** pint ** const p 很好就理解了。
1.const int ** p 表示**p代表的整形内存放的常量不能够被修改。而指针p本身变量可以被修改。( const修饰的是int

2.int ** const p 表示指针p本身常量不能被修改。而**p代表的整形内存放的值变量可以被修改。( const 修饰 的是int **

3. int * const * p 是一个二级指针,const 修饰 的是int *,代表指针*p的值是常量不能被修改。而**p所代表的整形内存放的是变量可以被修改指针p本身是变量也可以被修改。(通俗来说,就是二级指针p所指向的一级指针*p不能被修改,而**p所代表的整形,可以被修改。指针p本身,也可以被修改。

  由于害怕一篇博客太过冗长,知识点太散乱。const修饰的二级指针中的一些重要问题下篇博客进行详细介绍。
本人初学者一枚,能力有限,难免出现纰漏,希望大家可以给出指正。

猜你喜欢

转载自blog.csdn.net/SoYangA/article/details/80292025