猿问

常量指针与常量值上的指针

常量指针与常量值上的指针

以下声明之间有什么区别?


char * const a;

const char * a;

为了理解我写这个小程序的区别:


#include <stdio.h>

#include <stdlib.h>



int main (int argc, char **argv)

{

    char a = 'x';

    char b = 'y';


    char * const pc1 = &a;

    const char * pc2 = &a;


    printf ("Before\n");

    printf ("pc1=%p\n", pc1);

    printf ("*pc1=%c\n", *pc1);

    printf ("pc2=%p\n", pc2);

    printf ("*pc2=%c\n", *pc2);


    *pc1 = b;

/*     pc1 = &b; */


/*     *pc2 = b; */

    pc2 = &b;


    printf ("\n\n");


    printf ("After\n");

    printf ("pc1=%p\n", pc1);

    printf ("*pc1=%c\n", *pc1);

    printf ("pc2=%p\n", pc2);

    printf ("*pc2=%c\n", *pc2);


    return EXIT_SUCCESS;

}

我编译了程序(使用gcc 3.4)并运行它。输出突出显示了差异:


Before

pc1=ffbfd7e7

*pc1=x

pc2=ffbfd7e7

*pc2=x



After

pc1=ffbfd7e7

*pc1=y

pc2=ffbfd7e6

*pc2=x

但是,我必须编写小程序才能得到答案。如果我离开机器(例如在面试时),我将无法回答这个问题。


有人可以通过评论上面的例子来解释const关键字的运作方式吗?


陪伴而非守候
浏览 387回答 3
3回答

白衣非少年

char&nbsp;*&nbsp;const&nbsp;a;指的是指针是常量和不可变的,但指针数据不是。在这种情况下,您可以使用const_cast(在C ++中)或c样式转换来抛弃常量,因为数据本身不是常量。const&nbsp;char&nbsp;*&nbsp;a;表示无法使用指针a写入指向的数据。const_cast在这种情况下使用(C ++)或c样式转换来抛弃常量会导致未定义的行为。

哆啦的时光机

现在你知道了char * const a和之间的区别const char * a。很多时候,如果它是一个常量指针或指向常量变量的指针,我们会感到困惑。怎么看?按照以下简单步骤识别上面两个。让我们看看如何阅读下面的声明char&nbsp;*&nbsp;const&nbsp;a;从右到左阅读现在开始a,1。毗邻a那里const。char *&nbsp;(const a);--->所以a是constant&nbsp;(????)。2。现在就去吧*烧焦(* (const a));--->所以,&nbsp;a是constant&nbsp;pointer到(????)。3。一起去吧char(char (* (const a)));--->&nbsp;a是一个constant&nbsp;pointer以character可变a&nbsp;is&nbsp;constant&nbsp;pointer&nbsp;to&nbsp;character&nbsp;variable.阅读不容易吗?类似于第二次宣言const&nbsp;char&nbsp;*&nbsp;a;现在再次开始a,1。毗邻a那里*--->所以a是pointer(????)2。现在有char--->&nbsp;a是的pointer&nbsp;character,那没有任何意义!所以洗牌pointer和character--->&nbsp;a是character&nbsp;pointer的(?????)3。现在你有了constant--->所以a是character&nbsp;pointer对constant可变但是,虽然你可以弄清楚声明的含义,但让它听起来更合理。a&nbsp;is&nbsp;pointer&nbsp;to&nbsp;constant&nbsp;character&nbsp;variable
随时随地看视频慕课网APP
我要回答