您的位置:首页 > 其它

易犯错让人混淆的指针与Const

2015-10-28 19:52 309 查看
易犯错让人混淆的地方,首先看看下面的几种定义:

#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修饰,表示指针的地址不能改
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: