【发布时间】:2018-06-14 17:38:29
【问题描述】:
我到处都能看到:
-
http://www.cplusplus.com/reference/cstdio/printf/ -> printf 采用
const char *fmt而不是char * const fmt的格式。 - https://msdn.microsoft.com/en-us/library/e0z9k731.aspx -> 字符串接受为 const 指针而不是指针 const。
- glShaderSource: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glShaderSource.xhtml -> 字符串被当作 const 指针而不是指针 const。
- https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx -> messageboxa/messageboxw 使用指向字符串的 const 指针而不是指向 const 的指针。
我是不是误解了什么,或者这只是对 api 设计者如何用 C 表达事物的误解?
据我了解,
-
const char *a,是指向一个字符的指针,您不能将其更改为指向另一个字符。 -
char * const a是一个指向您无法取消引用以更改其值的 char 的指针。 -
const char * consta 是一个指向 char 的指针,您不能将其更改为指向另一个 char(或包含许多字符的连续块的第一个 char),并且您不能通过取消引用来更改指向的 char 的值。
提前谢谢。
看来我是另辟蹊径:
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. 和 2. 弄混了,它们是相反的。
-
病态测试是肯定的。
-
嗯..
const obj *和obj *const是两个完全不同的东西。如果他们需要const obj *,为什么还要使用obj *const? -
这里有一个技巧可以帮助您:从右到左阅读。
char * const a;读作“a 是指向 char 的 const 指针”。const char * a;是“a 是指向 char 常量的指针”。 -
const T *和T const *指定一个指向常量T的指针。T * const指定一个指向T的常量指针。大多数 API 使用const T *或T const *,因为它们承诺不会更改指向的内容。