C中各种const声明的区别

时间:2010-05-24 21:29:22

标签: c programming-languages

  

可能重复:   What is the difference between const int*, const int * const, and int const *?

以下是什么区别?

char const *p;
const char  *p;
char *const p;

还有一个很好的网站,我可以重新学习C和C ++吗?我似乎忘记了这一点,而且面试对我来说很困难......

7 个答案:

答案 0 :(得分:17)

前两个是相同的。

诀窍是,向后阅读....

所以第一个是:

backwards: p * const char
read:      p is a pointer to a const char
meaning:   you can change p to point a at something else, but you can't
           change what it points at

最后一个是:

backwards: p const * char
read:      p is a const pointer to a char
meaning:   p is a pointer which you can't change what it points at, but
           you can change the thing it points to.

答案 1 :(得分:3)

我非常喜欢cplusplus.com以供参考和学习。

答案 2 :(得分:3)

char const *const char *是相同的。指针是非const的(你可以修改指针),但是chars是const(你不能改变他们指向的字符)。你可以这样做

p += 1;

但不是这个

*p += 1;

char * const是指向非const字符的const指针。这意味着你可以这样做

*p += 1;

但不是这个

p += 1;

答案 3 :(得分:2)

前两个是相同的,表示指向const char的指针。第二个是指向(非const)char的常量指针。在第一种情况下,您可以/可以更改指针,而不是指向的指针。在第二种情况下,您可以更改它指向的内容,但不能使指针指向不同的内存。

指针声明/定义的主要内容是跟踪'*':

char X * Y ptr;

“X”或“Y”可以替换为constvolatile,或两者兼而有之。 'X'替换将修改指针指向AT的内容。 'Y'替换将修改指针本身。在'X'部分,您可以X charchar X - 这根本没有区别。有什么不同的是相对于'*'的位置。如果修饰符位于类型名称旁边,则它会修改指针指向的内容。如果修饰符位于指针名称旁边,则它会修改指针本身。

答案 4 :(得分:0)

char const * (char const *):您无法通过此指针更改此指向的值。 Ergo:常量指针。

char *const:你只能初始化为某个东西的指针 - 以后不能改变。

此代码说明了这一点:

int main()
{
    char a = 'a';
    char b = 'b';

    char const *p1; //p1 is the same as p2 const char = char const
    const char  *p2;
    char *const p3 = &a; //Can only assign like this.

    p1 = &a;
    p2 = &a;

    *p1 = b; //Will not compile - cannot change the value via the pointer.
    *p2 = b; //Will not compile - cannot change the value via the pointer.

    p3 = &a; //Will not compile - cannot reassign the pointer

    printf("p1 = %c\n",*p1);
    printf("p2 = %c\n",*p2);
    printf("p3 = %c\n",*p3);

    return 0;
}

答案 5 :(得分:0)

  1. 购买Kernighan & Ritchie(K& R)的副本并完成它。
  2. 在K& R中进行练习,并了解The C Answer Book中提供的解决方案。
  3. 购买Accelerated C++的副本并完成它,因为它将C ++视为自己的语言,而不仅仅是“C用螺栓固定”。
  4. 购买Effective C++的副本,不要违反这些项目并阅读每一项,以了解您不应违反这些项目的原因。
  5. 作为额外的好处,请阅读Effective STL以正确使用STL

答案 6 :(得分:0)

这里有两个不同的东西,一个指针和它指向的数据const可用于其中一个或两个。

没有const

的示例
char *p = "hello";
++p;              // Changes the pointer, now points to 'e'
*p = 'u';         // Changes the data, now "hullo"

const

的示例

正如@tc所说,请向后阅读声明。

  1. 您可以更改指针,但不能更改指向

    的数据
    // These two declarations have the same effect
    char const *p = "hello";  // Pointer to constant char
    const char *p = "hello";  // Pointer to char which is constant
    ++p;              // OK
    *p = 'u';         // Won't compile
    
  2. 2您可以更改“hello”,但不能更改指针

        char * const p = "hello"; // Constant pointer to char
        ++p;              // Won't compile
        *p = 'u';         // OK
    
    1. 您可以同时使用

      char const * const p = "hello"; // Constant pointer to constant char
      ++p;              // Wont' compile
      *p = 'u';         // Wont' compile