一、const修饰的一级指针(关于指针的简要介绍在这里,建议在阅读本篇博客前浏览一下点击打开链接)
const int * p int const * p
int * const p
被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 ** p,int ** 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修饰的二级指针中的一些重要问题下篇博客进行详细介绍。
本人初学者一枚,能力有限,难免出现纰漏,希望大家可以给出指正。