C 为什么许多API使用;常数obj*”;超过;“对象*常数”;他们的输入参数?

C 为什么许多API使用;常数obj*”;超过;“对象*常数”;他们的输入参数?,c,pointers,C,Pointers,我到处都能看到: ->printf采用的格式为const char*fmt,而不是char*const fmt ->接受作为常量指针而不是指针常量的字符串 glShaderSource:->字符串作为常量指针而不是指针常量 ->messageboxa/messageboxw将常量指针指向字符串,而不是指向常量的指针 是我误解了什么,还是这只是api设计师对如何用C语言表达的误解 据我了解, const char*a,是指向某个字符的指针,不能更改为指向另一个字符 char*const a是指向无

我到处都能看到:

  • ->printf采用的格式为
    const char*fmt
    ,而不是
    char*const fmt
  • ->接受作为常量指针而不是指针常量的字符串
  • glShaderSource:->字符串作为常量指针而不是指针常量
  • ->messageboxa/messageboxw将常量指针指向字符串,而不是指向常量的指针
  • 是我误解了什么,还是这只是api设计师对如何用C语言表达的误解

    据我了解,

  • const char*a
    ,是指向某个字符的指针,不能更改为指向另一个字符
  • char*const a
    是指向无法取消引用以更改其值的字符的指针
  • const char*const
    a是指向一个字符的指针,您不能将其更改为指向另一个字符(或包含多个字符的连续块的第一个字符),也不能通过取消引用来更改所指字符的值
  • 提前谢谢

    看来我是从另一个角度理解的:

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


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


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

    您混淆了1。第二,他们正好相反。我会测试确定的。嗯
    const obj*
    obj*const
    是两个完全不同的东西。如果他们需要
    const obj*
    ,为什么要使用
    obj*const
    ?这里有一个技巧可以帮助你:从右到左阅读<代码>字符*常量a读作“a是指向字符的常量指针”<代码>常量字符*a是“a是指向char常量的指针”。
    const T*
    T const*
    指定指向常量
    T
    的指针
    T*const
    指定指向
    T
    的常量指针。大多数API使用
    const T*
    T const*
    ,因为它们承诺不会更改所指向的对象。(
    const char*
    ==
    const char*
    )不是真的,
    char*elephant=“elephant”;const char*p1=“狼”;char*const p2=“绵羊”;int main(int argc,char**argv){p1=elephant;*p1=elephant[0];/*error*/p2=elephant;/*error*/*p2=elephant[0];return 0;}
    表明我的编译器对它们的处理方式不同。@Dmitry Please read.en.cppreference.com不是语言标准,而是(至少是最后的自由草稿)