• 【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’}是三个字符常量,并不是地址值。所以初始化是错误的。

    未完待续……

  • 相关阅读:
    IE9 Beta首则演示视频泄露 狼人:
    浅析网页界面设计——首页设计 狼人:
    需警惕CSS3属性的书写顺序 狼人:
    IE9 Beta与四大浏览器基准测试对比 狼人:
    Ubuntu 9.04将在10月23日停止更新服务和技术支持 狼人:
    IE9对CSS3的支持情况概述 狼人:
    ASP.NET惊爆新安全漏洞 攻击者可访问任意文件 狼人:
    Rails3之父Yehuda离开Engine Yard投奔HTML5 狼人:
    实用HTML,CSS和JavaScript速查表 狼人:
    20个学习CSS的绝佳网站——让你从入门到精通 狼人:
  • 原文地址:https://www.cnblogs.com/yyehl/p/6652932.html
Copyright © 2020-2023  润新知