自学内容网 自学内容网

C/C++学习-常量指针&指针常量

常量指针(记忆:const修饰*p,即指针p所指向的值,即a不可以改,因此不能通过指针修改数据)

常量指针是C/C++语言中的一个概念,它指的是指针本身可以改变指向,但是通过指针访问的数据是常量,即不能通过指针来修改所指向的数据。
具体来说,常量指针有两个主要的特性:

  1. 指针可以改变指向:这意味着你可以让指针指向不同的地址,但是你不能通过这个指针来改变那个地址上的值。
  2. 不能通过指针修改数据:指针所指向的数据是只读的,任何试图通过指针修改数据的操作都会导致编译错误。
    在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++语言中的含义是不同的。指针常量指的是指针本身是一个常量,也就是说,一旦指针被初始化指向某个地址,它的值就不能再改变,但是它可以用来修改它所指向的数据(前提是该数据不是常量)。
下面是关于指针常量的一些关键点:

  1. 指针的值是常量:这意味着一旦指针被初始化,它就不能再指向其他地址。
  2. 可以修改指针所指向的数据:如果指针指向的数据不是常量,那么可以通过指针来修改该数据。
    在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关键字:

  1. 第一个const位于int之前,表示指针p指向的数据是常量。这意味着你不能通过指针p来修改它所指向的值。
  2. 第二个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)!