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是指向无
const char*fmt
,而不是char*const fmt
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不是语言标准,而是(至少是最后的自由草稿)