为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
陪伴而非守候 2019-08-24 15:22:31
常量指针与常量值上的指针以下声明之间有什么区别?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)并运行它。输出突出显示了差异:Beforepc1=ffbfd7e7*pc1=xpc2=ffbfd7e7*pc2=xAfterpc1=ffbfd7e7*pc1=ypc2=ffbfd7e6*pc2=x但是,我必须编写小程序才能得到答案。如果我离开机器(例如在面试时),我将无法回答这个问题。有人可以通过评论上面的例子来解释const关键字的运作方式吗?
查看完整描述

3 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

char * const a;

指的是指针是常量和不可变的,但指针数据不是。在这种情况下,
您可以使用const_cast(在C ++中)或c样式转换来抛弃常量,因为数据本身不是常量。

const char * a;

表示无法使用指针a写入指向的数据。const_cast在这种情况下使用(C ++)或c样式转换来抛弃常量会导致未定义的行为


查看完整回答
反对 回复 2019-08-24
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

现在你知道了char * const a和之间的区别const char * a。很多时候,如果它是一个常量指针或指向常量变量的指针,我们会感到困惑。

怎么看?按照以下简单步骤识别上面两个。

让我们看看如何阅读下面的声明

char * const a;

从右到左阅读

现在开始a

1。毗邻a那里const

char * (const a);

--->所以aconstant (????)

2。现在就去吧*

烧焦(* (const a));

--->所以, aconstant pointer(????)

3。一起去吧char

(char (* (const a)));

---> a是一个constant pointercharacter可变

a is constant pointer to character variable.

阅读不容易吗?

类似于第二次宣言

const char * a;

现在再次开始a

1。毗邻a那里*

--->所以apointer(????)

2。现在有char

---> a是的pointer character

那没有任何意义!所以洗牌pointercharacter

---> acharacter pointer(?????)

3。现在你有了constant

--->所以acharacter pointerconstant可变

但是,虽然你可以弄清楚声明的含义,但让它听起来更合理。

a is pointer to constant character variable


查看完整回答
反对 回复 2019-08-24
  • 3 回答
  • 0 关注
  • 386 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信