C/C++学习-常量指针&指针常量
文章目录
常量指针(记忆:const修饰*p,即指针p所指向的值,即a不可以改,因此不能通过指针修改数据)
常量指针是C/C++语言中的一个概念,它指的是指针本身可以改变指向,但是通过指针访问的数据是常量,即不能通过指针来修改所指向的数据。
具体来说,常量指针有两个主要的特性:
- 指针可以改变指向:这意味着你可以让指针指向不同的地址,但是你不能通过这个指针来改变那个地址上的值。
- 不能通过指针修改数据:指针所指向的数据是只读的,任何试图通过指针修改数据的操作都会导致编译错误。
在C/C++中,你可以通过以下方式声明一个常量指针:
const int *p;
这里的const
是用于修饰*p
的,意味着*p
是常量,而不是p
本身。因此,下面的操作是允许的:
int a = 10;
int b = 20;
const int *p = &a; // p是一个指向整型常量的指针,初始化指向a
p = &b; // p改变了指向,现在指向b,这是允许的
但是,下面的操作是不允许的:
*p = 30; // 错误:不能通过p修改它所指向的数据
如果你希望指针本身也是常量,即指针的指向一旦确定就不能再改变,你应该这样声明:
int a = 10;
int *const p = &a; // p是一个指向整型的常量指针,初始化指向a
// *p = 20; // 这是允许的,可以通过p修改a的值
// p = &b; // 错误:p是常量指针,不能改变其指向
如果你希望指针既不能改变指向,也不能通过它修改数据,你可以将两个const
结合起来:
const int a = 10;
const int *const p = &a; // p是一个指向整型常量的常量指针
// *p = 20; // 错误:不能通过p修改它所指向的数据
// p = &b; // 错误:p是常量指针,不能改变其指向
常量指针在C/C++中用于保护数据不被意外修改,是编写安全代码的重要工具之一。
指针常量(记忆:这里const修饰p,即a的地址,故p的值不能改,也就是p的指向不能改,不能再指向其他地址)
指针常量(Pointer to Constant)与常量指针(Constant Pointer)是两个容易混淆的概念,但它们在C/C++语言中的含义是不同的。指针常量指的是指针本身是一个常量,也就是说,一旦指针被初始化指向某个地址,它的值就不能再改变,但是它可以用来修改它所指向的数据(前提是该数据不是常量)。
下面是关于指针常量的一些关键点:
- 指针的值是常量:这意味着一旦指针被初始化,它就不能再指向其他地址。
- 可以修改指针所指向的数据:如果指针指向的数据不是常量,那么可以通过指针来修改该数据。
在C/C++中,你可以通过以下方式声明一个指针常量:
int a = 10;
int *const p = &a; // p是一个指针常量,初始化指向a
在上面的声明中,const
关键字修饰的是p
,而不是*p
,这表明p
是一个常量指针,其指向不能改变。
以下是使用指针常量时的一些合法和不合法的操作:
合法操作:
*p = 20; // 允许:通过指针p修改它所指向的数据a的值
不合法操作:
p = &b; // 错误:p是一个指针常量,不能改变其指向
指针常量通常用于以下场景:
- 当你需要一个始终指向特定变量的指针时,即使该变量的值可能会改变。
- 在函数参数中,当需要保证函数内部不会改变指针的指向,但可以修改指针所指向的数据时。
需要注意的是,如果指针常量指向的数据本身是常量,那么你也不能通过该指针修改数据:
const int b = 20;
int *const p = &b; // 错误:指针常量不能指向一个常量数据
在上面的例子中,声明是错误的,因为b
是一个常量,不能通过非常量指针来指向它。正确的声明应该是:
const int b = 20;
const int *const p = &b; // p是一个指向整型常量的指针常量
在这种情况下,p
既不能改变其指向,也不能通过它来修改b
的值。
常量指针指向常量数据(记忆:不能通过指针修改数据,也不能修改指针的指向,一对一了属于是)
当我们在C或C++中使用一个常量指针指向常量数据时,这意味着指针本身和它所指向的数据都不能被修改。这种用法通常用于保护数据不被意外修改,确保数据的完整性。
以下是一个声明常量指针指向常量数据的例子:
const int* const p = &a;
在这个声明中,有两个const
关键字:
- 第一个
const
位于int
之前,表示指针p
指向的数据是常量。这意味着你不能通过指针p
来修改它所指向的值。 - 第二个
const
位于*
之后,表示指针p
本身是一个常量指针。这意味着一旦p
被初始化指向某个地址,你就不能改变p
的指向。
让我们逐一分析以下几点:
指针指向的数据是常量
由于p
是一个指向const int
的指针,以下操作是不允许的:
*p = 10; // 错误:不能通过p修改它所指向的数据
即使a
本身不是一个常量,你不能通过p
来修改它,因为p
被声明为指向常量数据的指针。
指针本身是常量
由于p
被声明为const
指针,以下操作也是不允许的:
p = &b; // 错误:不能改变p的指向
一旦p
被初始化指向某个地址(比如&a
),你就不能将p
重新指向另一个地址。
正确使用常量指针指向常量数据
以下是如何正确使用这种类型的指针:
int a = 5;
const int* const p = &a;
// 以下操作是允许的:
int value = *p; // 读取p所指向的数据
// 以下操作是不允许的:
*p = 10; // 错误:不能通过p修改它所指向的数据
p = &value; // 错误:不能改变p的指向
总结来说,声明一个常量指针指向常量数据,可以确保指针本身和它所指向的数据在声明后都不会被修改,这对于维护程序中的不变性非常有用。
原文地址:https://blog.csdn.net/Qhumaing/article/details/143834263
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!