常量指针 vs 常值指针

155

以下声明有什么区别?

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 关键字的操作吗?


9
以下是更完整的答案,但我认为 const “绑定到下一个标记”。因此,在 char * const a 中,不能修改的是变量本身即 a。在 const char * a 中,不能修改的是所指向的字符。在C语言中,const 关键字用于声明常量或指针常量(指向常量)。当应用于指针类型时,它通常被放置在星号(*)之前或之后。如上所述,const 的位置决定了它所适用的内容。 在 char * const a 中,const 修饰的是 a ,表示 a 是一个指向字符数组的不可变指针,也就是说该指针不能再指向其他地址,但可以修改数组元素的值。而在 const char * a 中,const 修饰的是 *a 即指针所指向的字符,表示所指向的字符是不可修改的,指针本身可以指向其他地址。总之,const关键字用于指定变量或指针是否可以被修改,根据其位置不同对应的对象也不同。 - davmac
我认为标题应该写成“常量指针 vs 指向常量值的指针”。 - RBT
11个回答

0
const char * a;

这表示指向常量字符的指针。 例如:

char b='s';
const char *a = &b;

这里的a指向一个常量字符(在本例中为's')。你不能使用a来改变该值。但是,这个声明并不意味着它所指向的值是真正的常量,它只是表示在a的范围内该值是一个常量。 你可以通过直接改变b的值来改变它的值,但是你不能通过a指针间接地改变它的值。

*a='t'; //无效 b='t' ; //有效

char * const a=&b

这里声明了一个指向字符的常量指针。 它将限制a只能指向b,但允许您更改b的值。

希望对您有所帮助!!! :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接