【问题标题】:Difference of various const declarations in C [duplicate]C中各种const声明的区别[重复]
【发布时间】:2011-02-23 10:26:30
【问题描述】:

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

以下有什么区别?

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

有没有一个可以让我重新学习 C 和 C++ 的好网站?看来我忘记了,工作面试让我很难过......

【问题讨论】:

标签: c programming-languages


【解决方案1】:

前两个是一样的。

诀窍是,倒着读....

所以第一个是:

向后:p * const char 读: p 是一个指向 const char 的指针 含义:您可以更改 p 以将 a 指向其他东西,但您不能 改变它指向的东西

最后一个是:

向后:p const * char 读取:p 是一个指向 char 的 const 指针 含义: p 是一个指针,你不能改变它指向的东西,但是 你可以改变它指向的东西。

【讨论】:

    【解决方案2】:

    我很喜欢cplusplus.com,供参考和学习。

    【讨论】:

      【解决方案3】:

      char const *const char * 是一样的。指针是非常量的(您可以修改指针),但字符是常量(您不能更改它们指向的字符)。你可以这样做

      p += 1;
      

      但不是这个

      *p += 1;
      

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

      *p += 1;
      

      但不是这个

      p += 1;
      

      【讨论】:

        【解决方案4】:

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

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

        char X * Y ptr;
        

        “X”或“Y”都可以替换为const,或volatile,或两者兼而有之。 'X' 替换将修改指针指向的 AT。 'Y' 替换将修改指针本身。在“X”部分,您可以使用X charchar X——这完全没有区别。不同之处在于相对于“*”的位置。如果修饰符在类型名称旁边,它会修改指针指向的内容。如果修饰符在指针名称旁边,那么它会修改指针本身。

        【讨论】:

          【解决方案5】:

          char const * (char const *): 你不能通过这个指针改变 this 指向的值。尔格:常量指针。

          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;
          }
          

          【讨论】:

            【解决方案6】:
            1. 购买一份Kernighan & Ritchie (K&R) 并完成它。
            2. 在 K&R 中做练习,了解The C Answer Book 中提供的解决方案。
            3. 购买一份Accelerated C++ 并完成它,因为它将 C++ 视为自己的语言,而不仅仅是“固定”的 C。
            4. 购买Effective C++ 的副本,不要违反这些条款,并逐一阅读以了解为什么不应该违反它们。

            另外,阅读Effective STL 以正确使用STL

            【讨论】:

              【解决方案7】:

              这里有两个独立的东西,一个指针和它指向的数据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 你可以改变“你好”,但不能改变指针

                  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
                

              【讨论】:

                猜你喜欢
                • 2010-10-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-11-06
                • 1970-01-01
                • 2012-02-01
                • 1970-01-01
                • 2011-05-06
                相关资源
                最近更新 更多