易犯错让人混淆的地方,首先看看下面的几种定义:
#include<stdio.h>
#include<stdlib.h>
void main()
{
//这两种是一样的意思,都表示定义一个常量num1、num2不能被修改
int const num1 = 10;
const int num2 = 20;
//num1 = 1; num1、和num2都不能被修改
//num2 = 2;
getchar();
}
如果我们定义的是一个指针是什么情况呢?
#include<stdio.h>
#include<stdlib.h>
void main()
{
//这两种是一样的意思,都表示定义一个常量num1、num2不能被修改
int num1 = 10;
int num2 = 20;
int const *p1;
const int *p2;
//这里p1、p2都可以赋值新地址,那么表示自身不是一个常量
p1 = &num1;
p1 = &num2;
p2 = &num2;
p2 = &num1;
//这里给p1、p2指向的单元重新赋值会报错,如下图
//表明这时候的他们都能指向任意的地址,但是不能修改
//*p1 = 1;
//*p2 = 2;
//所以这种声明是等价的
getchar();
}
然后我们看看下面的情况
#include<stdio.h>
#include<stdlib.h>
void main()
{
//这两种是一样的意思,都表示定义一个常量num1、num2不能被修改
int num1 = 10;
int num2 = 20;
int* const p1 = &num1;
//这个时候修改p1指向的地址,会报错,说 p1是一个常量。
//p1 = &num2;
//而此时p1可以修改指向单元的数据
*p1 = 1;
//因此,这种方式声明表示的是 定义一个指向整型数据的一个常量指针
//自己的地址不能被修改,但是指向的单元数据可以被修改
getchar();
}
最后看一种情况:
#include<stdio.h>
#include<stdlib.h>
void main()
{
//这两种是一样的意思,都表示定义一个常量num1、num2不能被修改
int num1 = 10;
int num2 = 20;
//这里定义的int const 和 const int 在前面的例子中表示的一样效果
//所以有两种定义方式
int const * const p1 = &num1;
const int * const p2 = &num2;
//此时我们发现 我们修改p1、p2的地址的指向的数据都不可以
//p1 = &num2;
//p2 = &num1;
//*p1 = 2;
//*p2 = 1;
//因此这种方式定义的 表示的是指向常量的常量指针
getchar();
}
所以综上的情况:可以得知
在指针(*)左边使用const修饰,表示指向的元素值不能改
在指针(*)右边使用const修饰,表示指针的地址不能改