例1: int x = 3; const int *p = &x; //const修饰*p 注意: 1,p的值(指向的地址)可以修改, 2,*p的值不可以直接修改 3,x是变量,可修改x值去修改*p的值 |
(1)尝试修改p
#include<stdlib.h>
#include<iostream>
using namespace std;
int main()
{
int x = 3;
int y = 5;
const int *p = &x; //指针p原来指向x的地址
p = &y; //正确,因为p可以修改
cout <<*p << endl;
cout << p<< endl;
}
运行结果:
(2)尝试修改*p
#include<stdlib.h>
#include<iostream>
using namespace std;
int main()
{
int x = 3;
int y = 5;
const int *p = &x; //const修饰*p
*p = 7; //修改*p 会报错
}
运行结果:编译不通过。
1>------ 已启动生成: 项目: ConsoleApplication1, 配置: Debug Win32 ------
1>luoyiran.cpp
1>e:\c++\my c++\consoleapplication1\consoleapplication1\luoyiran.cpp(13): error C3892: “p”: 不能给常量赋值
1>已完成生成项目“ConsoleApplication1.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
(3)尝试修改x
#include<iostream>
using namespace std;
int main()
{
int x = 3;
const int*p = &x;
cout << *p << endl;
x = 6; //x是变量,可以通过修改x的值去修改*p的值
cout << *p << endl;
system("pause");
return 0;
}
运行结果:
例2:
注意: 思维上可以通过*p去修改x的值,但是常量不可更改,x永远等于3 所以编译器不允许这 种情况发生,会报错 |
#include<iostream>
using namespace std;
int main()
{
const int x = 3;
int *p = &x;
system("pause");
return 0;
}
运行结果:编译不通过。
1>------ 已启动生成: 项目: ConsoleApplication1, 配置: Debug Win32 ------
1>luoyiran.cpp
1>e:\c++\my c++\consoleapplication1\consoleapplication1\luoyiran.cpp(10): error C2440: “初始化”: 无法从“const int *”转换为“int *”
1>e:\c++\my c++\consoleapplication1\consoleapplication1\luoyiran.cpp(10): note: 转换丢失限定符
1>已完成生成项目“ConsoleApplication1.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
例3: int x = 3; //x是个变量 1,p不可以更改 2,*p可以更改 3,x是变量,可修改x值去修改*p的值 |
(1)尝试修改p
#include<stdlib.h>
#include<iostream>
using namespace std;
int main()
{
int x = 3;
int y = 5;
int*const p= &x; //const修饰p,p指向的地址不可改
p = &y; //失败
cout << p << endl;
cout << *p << endl;
system("pause");
return 0;
}
运行结果:报错
1>------ 已启动生成: 项目: ConsoleApplication1, 配置: Debug Win32 ------
1>luoyiran.cpp
1>e:\c++\my c++\consoleapplication1\consoleapplication1\luoyiran.cpp(13): error C3892: “p”: 不能给常量赋值
1>已完成生成项目“ConsoleApplication1.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
(2)尝试修改*p<=> 修改x
#include<stdlib.h>
#include<iostream>
using namespace std;
int main()
{
int x = 3;
int y = 5;
int*const p= &x;
*p = 10;
cout << x << endl;
cout << p << endl;
system("pause");
return 0;
}
运行结果:
(3)尝试修改x <=> 修改*p:
#include<stdlib.h>
#include<iostream>
using namespace std;
int main()
{
int x = 3;
int y = 5;
int*const p = &x;
cout << "&p=" << p << endl;
cout << "*p=" << *p << endl;
x = 5;
cout << "&p=" << p << endl;
cout << "*p=" << *p << endl;
system("pause");
return 0;
}
运行结果:可以发现,p的值一直不变,*p的值可以改变