const 指针和指向 const 值的指针作为参数

const pointer and pointer to const value as parameter

我有一个像下面这样的程序,并期望:

  1. with function void myFunc1 ( const int *x) ==> 我无法更改 x 指向的内存位置的值,但可以更改 [=12= 的内存位置] 指向.

  2. with function void myFunc2 ( int const *x) ==> 我无法更改 x 指向的位置,因为它是一个 const 指针。但是我可以更改 x 指向的内存位置的值。

但是,在编译代码时,我看不出 const int *xint const *x 之间的区别:

  1. 在两个函数中,*x=8行在两个函数return中出错。我没想到 myFunc2 会出错,因为它是 const 指针,而不是指向 const 值的指针。
  2. myFunc1 中,我希望在 myFunc1 关闭后看到值 5。

这里的专家能解释一下我上面的两个意想不到的结果吗?这是我的代码:

#include "stdio.h"

int a = 5;                      // declared a global,

void myFunc1 ( const int *x) {  // const parameter: pointer to a const int value.
    // *x= 8;                   // error: assignment of read-only location ‘* x’ ==> cannot change the value at the location pointed by pointer. This is expected
    printf("%d \n ", *x);       
    x = &a;                     // can change where the pointer point to. 
                                // a is global and is not loss after closing myFunc2
    printf("value in myFunc1: %d \n ", *x);                           
}


void myFunc2 ( int const *x) {   // const parameter: const pointer, cannot change the address that x points to. 
    //  *x= 8;                  // error: assignment of read-only location ‘* x’ 
    printf("%d \n ", *x);       
    x = &a;                     // no compiling error here. This is not expected.
                                
    printf("value in myFunc2: %d \n ", *x);                           
}

int main() {
    int *y;
    int z = 6;
    y = &z;
    printf("value before myFunc1: %d \n", *y);     
    myFunc1(y);
    printf("value after  myFunc1: %d \n", *y);        // expect to print 5. Result: print 6.
    
    printf("value before myFunc2: %d \n", *y);     
    myFunc2(y);
    printf("value after  myFunc2: %d \n", *y);        // expect to print 8 if the line *x=8 could be compiled . Result: print 6.
    return 1;
}

I don't see the different between having 2 parameters (const int *x) vs (int const *x):

那是因为 int const*const int* 是一回事。

如果你想让指针const,你必须在它的右边放一个const,像这样:int * const ,指向(非常量)integer.

的常量指针

const

上的不相关(是吗?)注释

我是支持所谓的东方const的人之一,这意味着我更喜欢把const写在什么的右边它适用于。例如,

  • 对于“指向常量 int 的指针”,我写 int const *
  • 对于“指向常量 int 的常量指针”,我写 int const * const.

如您所见,如果您从右到左阅读,引号中的句子将映射到类型:

//  1    2   3   4             4       3           2     1
   int const * const    // constant pointer to constant int

此外,始终将 const 视为可以放在其适用对象的 右边 的东西还有其他优点,有时是根据您可以发现的语言。

例如,以下是我如何发现更多关于引用的信息。

取引用常量的函数参数声明:int const& p。如果你这样写,并以 East const 的方式来思考它,很明显它声明了一个 p ,它是对常量 [= 的引用16=],不是对 int.

的常量引用

毕竟,考虑 East const,对 int 的常量引用会是什么样子?它将是 int & constconst 位于我们希望应用的对象的右侧,引用 &。但是,此语法不正确。

这是为什么?为什么我不能创建一个引用常量?因为它总是如此,因为引用无法重新绑定。该标准根本不允许您编写完全多余的内容作为 const 应用于参考。