C---const、指针、数组、指针常量,常量指针等归纳总结

文章目录

      • 1、char* const p (指针常量)
      • 2、const char* p (常量指针)
      • 3、const修饰数组
        • 3.1 const char array[]
        • 3.2 char const array[]
        • 3.3 数组的个人理解
      • 4、const char* array[]
      • 5、char* const array[]
      • 6、const char **pp;
      • 7、char** const pp

1、char* const p (指针常量)

指针是常量,指针的值不能改变,但是指针指向的值可以改变。

    char data = 'a';
    char buf = 'b';
   
    char* const p = &data;  //指针的值不能改变,但是指针指向的值可以改变
    //p = &buf;    //error:assignment of read-only variable‘p’
    *p = 'A';
    cout<<*p<<endl;  //A


2、const char* p (常量指针)

指向常量的指针:指针的值可以改变,但是指针指向的值不能改变。

    char data = 'a';
    char buf = 'b';
   
    const char* p = &data;
    p = &buf;
    //*p = 'A';      //error:assignment of read-only location‘*p’


3、const修饰数组

3.1 const char array[]

数组中的每个元素是const,不能改变

    const char array[5] = {'0', '1', '2', '3', '\0'};
    //array[3] = 'a';   //error:assignment of read-only location ‘array[3]’

3.2 char const array[]

同3.1 数组中的每个元素是const,不能改变

    char const array[5] = {'0', '1', '2', '3', '\0'};
    //array[3] = 'a';   //error:assignment of read-only location ‘array[3]’

3.3 数组的个人理解

数组,就是几个类型相同的元素。个人认为数组 char array[2] 可以理解成(char array) [2]。 该数组包含两个元素,每个元素是char类型。按照这种方法,上面的3.1和3.2就可以看成

    (const char array) [5] ,数组中每个元素是cosnt char

    (char const array) [5],数组中每个元素是 char const

由于const char, char const 是等价的。所以上述3.1 与 3.2 表现一致。带着这样的观点,我们来看下下面的介绍。



4、const char* array[]

    char data = 'a';
    char *p = &data;

    const char* array[5] = {p, p, p, p, NULL};
    array[0] = NULL;
    //*(array[1]) = 'A';  //error:assignment of read-only location ‘* array[1]’

通过这段代码可以看出:

(1) array[0]的值可以更改,即数组中每个元素不是常量,指针的值可以改变;
(2) array[1] 指向的值不能更改,即指针指向的值不能改变;

综合(1)(2),可以知道这其实就是一个常量指针 ( 第2节)。 那么再用3.3的观点验证一下:const char* array[5] 可以表述成 (const char* array) [5], 数组有5个元素,每个元素是const char*类型的,即指向常量的指针!



5、char* const array[]

    char data = 'a';
    char *p = &data;

    char* const array[5] = {p, p, p, p, NULL};
    //array[0] = NULL;  //error:assignment of read-only location ‘array[0]’
    *(array[0]) = 'A';

通过这段代码可以看出:

(1) array[0]的值不能改变,即数组中每个元素是常量,指针的值不能改变;

(2) array[0] 指向的值可以更改

综合(1)(2),可以知道这其实就是一个指针常量 ( 第1节)。 那么再用3.3的观点验证一下:(char* const array)[5],数组中每个元素的类型是char* const,即每个元素是指针常量:指针的值不能改变,但是指向的值可以改变!



6、const char **pp;

    char data = 'a';
    char *p = &data;

    const char* array[5] = {p, p, p, p, NULL};
    const char **pp = array;
    //*(*pp+1) = 'A';  //error: assignment of read-only location ‘*((* pp) + 1u)’
    //**pp = 'A';        //error: assignment of read-only location ‘* * pp’
    *pp = NULL; //OK
    pp = NULL;  //OK

const char**的类型是:“指向一个有const限定符的char类型的指针的指针”。从上面的代码可以看出pp指针可以改变,pp指向的值(*pp)也可以改变。这里const不是限定pp的。pp其实就是array,这里将pp替换成array,本节的情况就可以转化成第4节的内容。

同理 char* const *pp 可以转换成第5节的内容。



7、char** const pp

    char data = 'a';
    char *p = &data;

    char* array[5] = {p, p, p, p, NULL};
    char** const pp = array;
   
    **pp = 'A';
    *pp = NULL;   //OK
    //pp = NULL;  //error: assignment of read-only variable ‘pp’
    cout<<data<<endl; //A



原文链接:https://blog.csdn.net/slx_391987/article/details/39008539

你可能感兴趣的:(C/C++基础)