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

4 篇文章 0 订阅
2 篇文章 0 订阅

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

从上述代码可以看出:pp是一个常量,pp的值不能改变,但是pp指向的值可以改变。


上述几点仅为个人总结,如有不足之处,欢迎指出。谢谢!



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值