为什么许多apis使用“const obj *”而不是“obj * const”作为输入参数?

时间:2018-01-04 22:39:03

标签: c pointers

我到处都看到了:

  1. http://www.cplusplus.com/reference/cstdio/printf/ - > printf将格式设为const char *fmt而不是char * const fmt
  2. https://msdn.microsoft.com/en-us/library/e0z9k731.aspx - >字符串被接受为const指针而不是指针。
  3. glShaderSource:https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glShaderSource.xhtml - >字符串作为const指针而不是指针const。
  4. https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx - > messageboxa / messageboxw将const指针指向字符串,而不是指向const的指针。
  5. 我是否误解了某些内容,或者这只是对api设计师如何用C表达事物的误解?

    根据我的理解,

    1. const char *a,是指向char的指针,您无法将其更改为指向另一个char。
    2. char * const a是指向char的指针,您无法取消引用以更改值。
    3. const char * const a是指向char的指针,您无法将其更改为指向另一个char(或包含多个chars的连续块的第一个char),并且您无法通过取消引用来更改指向的char的值。
    4. 提前致谢。

      看起来我已经反过来了:

      char *elephant = "elephant";
      const char *p1 = "wolf";
      char * const p2 = "sheep";
      
      int main(int argc, char **argv)
      {
          p1 = elephant;
          *p1 = elephant[0]; /* error: assignment of read-only location '*p1' */
      
          p2 = elephant; /* error: assignment of read-only variable 'p2' */
          *p2 = elephant[0];
      
          return 0;
      }
      

      类似:

      #define ptrto(X) X *
      #define readonly(X) X const
      
      char const a = 'a';
      const char b = 'b';
      
      readonly(ptrto(char)) p1 = "p1";
      ptrto(readonly(char)) p2 = "p2";
      
      int main(int argc, char **argv)
      {
          p1 = &a; /* error: assignment of read-only variable 'p1' */
          *p1 = a; 
      
          p2 = &a; 
          *p2 = a; /* error: assignment of read-only location '*p2' */
      
          p1 = &b; /* error: assignment of read-only variable 'p1' */
          *p1 = b; 
      
          p2 = &b; 
          *p2 = b; /* error: assignment of read-only location '*p2' */
      
      
          return 0;
      }
      

1 个答案:

答案 0 :(得分:0)

请参阅http://en.cppreference.com/w/c/language/const

const char * == char const *是指向不可修改的字符数据的指针。

char * const是一个不可修改的指向字符数据的指针。