zoukankan      html  css  js  c++  java
  • 【C++学习笔记】由 const char* 引出的一系列问题

    1、const char* , char const * , char * const 之间的关系

    const char * p: p是一个指向常量字符的指针。指针所指的对象不能通过*p去改变(可以通过其他方式改变,与指针p无关),但是指针本身是可以改变的,也就是p可以去指向其他的char对象。p所指对象可以是常量的,也可以是非常量的,也就是常量的地址必须用指向常量的指针来存放,但是指向常量的指针可以存放常量或者非常量的地址
    char const * p : 和上面是一样的,表示的是一个指向常量的指针,不可通过*p来改变所指的对象。
    char * const p : p是一个常量指针,自身所存放的指向对象的地址不可改变,指向的对象可以是常量也可以是非常量。常量指针必须初始化,不可二次改变。

    2、 const char * 怎么定义与初始化呢?

    const char * p : p是一个指向字符常量的指针,p里面存放的是字符常量的地址。
    下面我们来看一个例子,我们想初始化一个const char *p:

    const char* p1 = "abc";
    const char* p2 = 'abc';
    const char* p3[] = {"ab", "b", "c"};
    const char* p4[] = {'ab', 'b', 'c'};

    上面哪个初始化的正确的呢?
    答案是 p1 和 p3。想要搞清楚这个问题,那我们先来搞搞清楚 ‘a’ 和 “a”的区别吧。

    3、‘a’ 和 “a” 的区别
    也就是字符与字符串的区别。
    ‘a’是一个字符,就像123是一个整形常量一样,是一个右值类型。
    “a”是一个字符串,实际表示的是“a”存放的地址。怎么理解呢?
    “abcd”这样一个用双引号的字符串,本质上是存放字符的一维数组,以结束符结束。使用”abcd”相当于使用数组名,也就是使用数组首元素的地址,即字符‘a’的地址。

    好了,解释完了字符与字符串的区别,我们再来看前面的初始化。

    const char* p1 = "abc";

    p1 是一个指向常量对象的指针,也就是说p1里面存放的应该是地址。而”abc”实际表示的就是首元素‘a’字符的地址。所以初始化是正确的。

    const char* p2 = 'abc';

    p2定义为指向字符常量的指针,应该存放一个地址值。但是右面‘abc’是一个字符常量,不是地址,所以初始化是错误的。

    const char* p3[] = {"ab", "b", "c"};

    p3定义为一个存放指向字符常量指针的数组。右边的{“ab”, “b”, “c”}表示的就是三个指向字符常量的地址值。

    const char* p4[] = {'ab', 'b', 'c'};

    p4定义为一个存放指向字符常量指针的数组。但是右边的{‘ab’, ‘b’, ‘c’}是三个字符常量,并不是地址值。所以初始化是错误的。

    未完待续……

  • 相关阅读:
    linux之awk命令
    HDU 2097 Sky数 进制转换
    HDU 2077 汉诺塔IV
    HDU 2094 产生冠军 dfs加map容器
    HDU 2073 叠框
    HDU 2083 简易版之最短距离
    HDU 2063 过山车 二分匹配
    天梯 1014 装箱问题
    天梯 1214 线段覆盖
    天梯 1098 均分纸牌
  • 原文地址:https://www.cnblogs.com/yyehl/p/6652932.html
Copyright © 2011-2022 走看看