以下声明有什么区别?
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
关键字的操作吗?
const
“绑定到下一个标记”。因此,在char * const a
中,不能修改的是变量本身即a
。在const char * a
中,不能修改的是所指向的字符。在C语言中,const
关键字用于声明常量或指针常量(指向常量)。当应用于指针类型时,它通常被放置在星号(*)之前或之后。如上所述,const
的位置决定了它所适用的内容。 在char * const a
中,const
修饰的是a
,表示 a 是一个指向字符数组的不可变指针,也就是说该指针不能再指向其他地址,但可以修改数组元素的值。而在const char * a
中,const
修饰的是*a
即指针所指向的字符,表示所指向的字符是不可修改的,指针本身可以指向其他地址。总之,const
关键字用于指定变量或指针是否可以被修改,根据其位置不同对应的对象也不同。 - davmac