我可以在指针类型声明中省略const限定符吗?

Can I omit const qualifiers in declaration for pointer types?

本文关键字:const 指针 类型 声明 中省 我可以      更新时间:2023-10-16

对于包含void foo(const int )类型声明的函数定义,以下两个声明都有效。

void foo(const int); // valid
void foo(int); // valid, const can be omitted.

但是如果函数定义包含void foo(const int*)类型的声明,省略const是非法的:

void foo(const int *); // valid declaration
void foo(int *); // error: const cannot be omitted.

为什么const不能在函数声明中省略,如果它的参数有指针类型?是什么造成了差异?

只能在直接应用于形参时省略const说明符。在指针的情况下,它被应用于被指向的对象,而不是指针本身,所以在const和形参之间有一个额外的间接层。在这种情况下,您可以省略它:

void foo(int* const);
void foo(int*);

const int x表示x在函数内为只读。外部世界不在乎这两种情况;函数正在使用实参的副本。

然而,const int *p意味着p指向只读的东西。外部世界并不关心这个;这是一个不能修改指针的承诺。

由此推论,以下两个声明是等价的:

void foo(const int *);
void foo(const int * const);

函数处理传入参数的副本。如果它是整数,你可以忽略const,因为原始的不会被触摸。对于指向int类型的指针,有三种选择:

  1. int* p
  2. const int* p(或int const* p)
  3. const int* const p(或int const* const p)

const可以应用于有指向对象,指针本身或两者。作为参数传递的是指针,因此可以在将其副本传递给函数时省略const。因此(2)和(3)可以互换使用(仅当用作函数参数类型时)。但是const对于指向对象类型有区别:

  • void foo(const int* p);//函数不能通过p
  • 修改指向整数对象
  • void foo(int* p);//函数可以通过p
  • 修改指向整数对象

在这两种情况下,函数都可以修改函数内部的p,但这些更改不会反映在原始指针的值上。