关于C#:char * const和const char *有什么区别?

What is the difference between char * const and const char *?

有什么区别:

1
char * const

1
const char *


区别在于const char *是指向const char的指针,而char * const是指向char的常量指针。

第一,被指向的值不能更改,但指针可以更改。第二,被指向的值可以更改,但指针不能更改(类似于引用)。

还有一个

1
const char * const

它是指向常量char的常量指针(因此不能更改任何内容)。

注:

以下两种形式是等效的:

1
const char *

1
char const *

在C++标准中描述了这一点的确切原因,但是注意并避免混淆是很重要的。我知道一些编码标准,它们更喜欢:

1
char const

结束

1
const char

(有指针或无指针)使const元素的位置与指针const元素的位置相同。


为避免混淆,请始终附加const限定符。

1
2
3
4
int       *      mutable_pointer_to_mutable_int;
int const *      mutable_pointer_to_constant_int;
int       *const constant_pointer_to_mutable_int;
int const *const constant_pointer_to_constant_int;


const总是修改它前面的事物(在它的左边),除非它是类型声明中的第一个事物,在类型声明中它修改它后面的事物(在它的右边)。

所以这两个是相同的:

1
2
int const *i1;
const int *i2;

它们定义指向const int的指针。您可以更改i1i2点的位置,但不能更改它们所指向的值。

这是:

1
int *const i3 = (int*) 0x12345678;

定义指向整数的const指针,并将其初始化为指向内存位置12345678。您可以更改地址12345678处的int值,但不能更改i3指向的地址。


const * char是无效的C码,没有意义。也许你想问一下const char *char const *之间的区别,或者可能是const char *char * const之间的区别?

参见:

  • 什么是常量指针(与指向常量对象的指针相反)?
  • C中的Const
  • C++中const声明的区别
  • C++常见问题
  • 为什么要更改const char*变量的值?

const char*是指向常量字符的指针。char* const是指向字符的常量指针。const char* const是指向常量字符的常量指针。


1)const char*x这里x基本上是一个指向常量值的字符指针。

2)char*const x是指字符指针,它是常量,但它所指向的位置可以更改。

3)const char*const x是1和2的组合,表示它是指向常量值的常量字符指针。

4)const*char x将导致编译器错误。不能声明。

5)char const*x等于点1。

经验法则是,如果const具有var名称,那么指针将是常量,但指向位置可以更改,否则指针将指向常量位置,指针可以指向其他位置,但指向位置内容不能更改。


Thumb rule of thumb:read the definition from right to left!

法国电力公司

"int不能改变的点(const)"。对编程员来说,这意味着"我不会改变什么是foo点到〔8〕点的价值"。

  • 这将使人残疾。
  • 允许的

法国电力公司

中文"fooCannot Change(const)and Points(*to an int"。对编程员来说,这意味着"我不会改变那个foo的记忆地址",Refers to the programmer this means"I will not change the memory address that foo.

  • 这是允许的。
  • 将致残。

法国电力公司

《不能改变的》(EDOCX1,11)、《不能改变的》(EDOCX1,11)、《点》(EDOCX1,9)、《不能改变的》(EDOCX1,11)"。这意味着"我不会改变什么foo的价值,我也不会改变foo的地址"。

  • 这将使人残疾。
  • 将致残。

第一个是语法错误。也许你的意思是

1
const char * mychar

1
char * const mychar

在这种情况下,第一个是指向无法更改的数据的指针,第二个是指向相同地址的指针。


另一个经验法则是检查const在哪里:

  • 存储的值是常量
  • 在*=>指针本身是常量之后

  • 许多答案提供了具体的技术、雷管等,以了解变量宣言的这一具体实例。但是,有一种通用技术可以理解任何宣言:

    Clockwise/Spiral Rule

    (a)

    1
    const char *a;

    按时钟/螺旋规则a指向常数的特性。意思是常数,但指针可以改变。很好,但很好

    (b)

    1
    char * const a;

    按照规则,以一个字符为准。你可以做a[2] = 'c';但你不能做a ="other string";


    我想指出,使用int const *(或const int *不是指指针指向一个const int变量,而是指这个特定指针的这个变量是const

    For example:

    1
    2
    int var = 10;
    int const * _p = &var;

    这个密码是完美的。Itself isn't constant.


  • 常数指针:一个常数指针仅能在整个程序中对各数据类型的一个单一变量进行点。我们可以改变指针指向的变量的值。初始化应在ITSELF声明的时间内完成。
  • 句法:

    1
    datatype *const var;

    在这个案件下

    ZZU1

  • 指针指向一个固定值:在这个指针中,指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指
  • 句法:

    或埃多克斯1

    在这个案件下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* program to illustrate the behavior of pointer to a constant*/

       #include<stdio.h>
       int main(){
           int a=10,b=20;
           int const *ptr=&a;
           printf("%d
    "
    ,*ptr);
           /*  *ptr=100 is not possible i.e we cannot change the value of the object pointed by the pointer*/
           ptr=&b;
           printf("%d",*ptr);
           /*we can point it to another object*/
           return 0;
        }

    Const和Const Char*?

  • 指向恒定值
  • 不能改变价值

  • 值恒定指针
  • 地址无法更改

  • 恒定值指针
  • 两者都不能改变。


    修正案立即适用于第三方的左侧。这方面唯一的例外是,在没有任何东西属于它的左边时,它立即适用于它的权利。

    这些是"恒定指针到恒定指针"的所有等效方式。

    • 法国电力公司
    • 法国电力公司
    • 法国电力公司
    • char const const *


    两条规则

  • 法国电力公司
  • 法国电力公司
  • E.G.

  • 法国电力公司
  • 法国电力公司

  • 我想你的意思是常量char*和char*常量。

    第一个常量char*是指向常量字符的指针。指针本身是可变的。

    第二个,char*const是指向字符的常量指针。指针不能更改,它指向的字符可以。

    还有常量char*const,指针和字符不能更改。


    这是一个详细的解释和代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    /*const char * p;
    char * const p;
    const char * const p;*/
    // these are the three conditions,

    // const char *p;const char * const p; pointer value cannot be changed

    // char * const p; pointer address cannot be changed

    // const char * const p; both cannot be changed.

    #include<stdio.h>

    /*int main()
    {
        const char * p; // value cannot be changed
        char z;
        //*p = 'c'; // this will not work
        p = &z;
        printf(" %c
    ",*p);
        return 0;
    }*/


    /*int main()
    {
        char * const p; // address cannot be changed
        char z;
        *p = 'c';
        //p = &z;   // this will not work
        printf(" %c
    ",*p);
        return 0;
    }*/




    /*int main()
    {
        const char * const p; // both address and value cannot be changed
        char z;
        *p = 'c'; // this will not work
        p = &z; // this will not work
        printf(" %c
    ",*p);
        return 0;
    }*/


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    // Some more complex constant variable/pointer declaration.
    // Observing cases when we get error and warning would help
    // understanding it better.

    int main(void)
    {
      char ca1[10]="aaaa"; // char array 1
      char ca2[10]="bbbb"; // char array 2

      char *pca1= ca1;
      char *pca2= ca2;

      char const *ccs= pca1;
      char * const csc= pca2;
      ccs[1]='m';  // Bad - error: assignment of read-only location ‘*(ccs + 1u)’
      ccs= csc;    // Good

      csc[1]='n';  // Good
      csc= ccs;    // Bad - error: assignment of read-only variable ‘csc’

      char const **ccss= &ccs;     // Good
      char const **ccss1= &csc;    // Bad - warning: initialization from incompatible pointer type

      char * const *cscs= &csc;    // Good
      char * const *cscs1= &ccs;   // Bad - warning: initialization from incompatible pointer type

      char ** const cssc=   &pca1; // Good
      char ** const cssc1=  &ccs;  // Bad - warning: initialization from incompatible pointer type
      char ** const cssc2=  &csc;  // Bad - warning: initialization discards ‘const’
                                   //                qualifier from pointer target type

      *ccss[1]= 'x'; // Bad - error: assignment of read-only location ‘**(ccss + 8u)’
      *ccss= ccs;    // Good
      *ccss= csc;    // Good
      ccss= ccss1;   // Good
      ccss= cscs;    // Bad - warning: assignment from incompatible pointer type

      *cscs[1]= 'y'; // Good
      *cscs= ccs;    // Bad - error: assignment of read-only location ‘*cscs’
      *cscs= csc;    // Bad - error: assignment of read-only location ‘*cscs’
      cscs= cscs1;   // Good
      cscs= cssc;    // Good

      *cssc[1]= 'z'; // Good
      *cssc= ccs;    // Bad - warning: assignment discards ‘const’
                     //                qualifier from pointer target type
      *cssc= csc;    // Good
      *cssc= pca2;   // Good
      cssc= ccss;    // Bad - error: assignment of read-only variable ‘cssc’
      cssc= cscs;    // Bad - error: assignment of read-only variable ‘cssc’
      cssc= cssc1;   // Bad - error: assignment of read-only variable ‘cssc’
    }