zoukankan      html  css  js  c++  java
  • 常量指针与指针常量

    常量指针与指针常量

    在C++中,经常会被指针和const搞得雨里雾里的。在这里简要梳理一下。

    一、常量指针

    所谓常量指针。就是指向常量的指针。而常量又是用const修饰,因此,常量指针的写法是这种:

    int const *p;

    或是const int *p;

    p就是指向常量int的一个指针。即p的内容(*p)是一个常量不可改变的,换句话说:*p=10;是不合法的

    而p本身则就是一个指针,对p的改变是同意的,即int a;p=&a是合法的。

    对于常量指针的初始化,则能够直接初始化或是先定义再赋值。

    如:

    int a=10,b=20;

    const int *p=&a;

    const int *q;

    q=&a;

    *q=b;//这句是不合法的。

    二、指针常量

    所谓指针常量就是定义的指针是个常量,即用const修饰的是该指针。其写法是这种:

    int * const p;

    * const int p;//该写法不常见

    const修饰的是指针p,那么指针p就是常量,不可改变,这里指的是地址,可是p指向的内容,即*p却是能够改变的。

    即 *p=10;//合法

    p=&a;//非法

    以下的代码都是合法的:

    char *a = "abcde1234";
    char *b = "bcde";
    char *const c = &a;
      
     a[0] = 'x'; // 我们并没有限制a为常量指针(指向常量的指针)
    或者
    *c[0] = 'x' // 与上面的操作一致

    三、指向常量的常量指针

    顾名思义,指向常量的常量指针就是对上述两种的综合。指针既是指向一个常量,又是呗const修饰的常量。

    写法例如以下:

    const int * const p;


    用一个样例作为总结。

    尽管字符指针与其他指针的本质是一样的。但是由于字符指针经常使用来表示字符串。常不好理解。以下就用字符指针来举例。



    char *a = "abcde1234";

    const char *b = "bcde"; // b是指向常量字符串的指针变量

    char *const c = &a;  // c是指向字符指针变量的常量

    const char *const d = &b; // d是指向字符常量的指针常量

    问题来了。

    1)问:由于a是变量。a能够赋值为其他值,如"12345abc"。那么c指向a,当a变化了,c指向什么呢?

    答:仍然指向"abcde1234"。尽管a能够指向别的字符串,但是c仍然指向"abcde1234",也就是a開始指向的对象。

    2)问:a是变量,能够改变a的内容。

    那么当运行了“a[0] = 'x';”后,c会如何呢?

    答:c当然还指向a初始指向的字符。

    只是。这个字符已经变成了'x'。

    3)问:b是指向常量的指针变量,当b指向别的字符串。d怎么样?

    答:d仍然指向b初始的字符串。



    4)问:b能够变化,b指向的字符不能变化,也就是说b[0]不能被又一次赋值,但是b[1]能够被又一次赋值吗?

    答:原则上b指向的字符是常量,并没有限制下一个字符,应该能够被赋值。但是由于你使用字符串进行了初始赋值,并且编译器是静态编译的,C/C++程序就把b当作字符串指针来处理了,因此。当对下一个字符进行赋值时,编译不能通过。


    四、总结

    const int *p;//内容确定。地址可变;

    int * const p;//内容可变,地址确定;

    const int * const p;//内容地址均确定

  • 相关阅读:
    积水路面Wet Road Materials 2.3
    门控时钟问题
    饮料机问题
    Codeforces Round #340 (Div. 2) E. XOR and Favorite Number (莫队)
    Educational Codeforces Round 82 (Rated for Div. 2)部分题解
    Educational Codeforces Round 86 (Rated for Div. 2)部分题解
    Grakn Forces 2020部分题解
    2020 年百度之星·程序设计大赛
    POJ Nearest Common Ancestors (RMQ+树上dfs序求LCA)
    算法竞赛进阶指南 聚会 (LCA)
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6742625.html
Copyright © 2011-2022 走看看