C++ 的const关键字与指针类型的结合注意事项

 

例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: 


    const int x = 3;   //const修饰x,因此x是个常量
    int *p = &x;        //指针p指向一个常量

    注意:

    思维上可以通过*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是个变量
int*  const 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;
 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的值可以改变

猜你喜欢

转载自blog.csdn.net/luoyir1997/article/details/82935962