可能重复: What is the difference between const int*, const int * const, and int const *?
以下是什么区别?
char const *p;
const char *p;
char *const p;
还有一个很好的网站,我可以重新学习C和C ++吗?我似乎忘记了这一点,而且面试对我来说很困难......
答案 0 :(得分:17)
前两个是相同的。
诀窍是,向后阅读....
所以第一个是:
backwards: p * const char read: p is a pointer to a const char meaning: you can change p to point a at something else, but you can't change what it points at
最后一个是:
backwards: p const * char read: p is a const pointer to a char meaning: p is a pointer which you can't change what it points at, but you can change the thing it points to.
答案 1 :(得分:3)
我非常喜欢cplusplus.com以供参考和学习。
答案 2 :(得分:3)
char const *
和const char *
是相同的。指针是非const的(你可以修改指针),但是chars是const(你不能改变他们指向的字符)。你可以这样做
p += 1;
但不是这个
*p += 1;
char * const
是指向非const字符的const指针。这意味着你可以这样做
*p += 1;
但不是这个
p += 1;
答案 3 :(得分:2)
前两个是相同的,表示指向const char的指针。第二个是指向(非const)char的常量指针。在第一种情况下,您可以/可以更改指针,而不是指向的指针。在第二种情况下,您可以更改它指向的内容,但不能使指针指向不同的内存。
指针声明/定义的主要内容是跟踪'*':
char X * Y ptr;
“X”或“Y”可以替换为const
或volatile
,或两者兼而有之。 'X'替换将修改指针指向AT的内容。 'Y'替换将修改指针本身。在'X'部分,您可以X char
或char X
- 这根本没有区别。有什么不同的是相对于'*'的位置。如果修饰符位于类型名称旁边,则它会修改指针指向的内容。如果修饰符位于指针名称旁边,则它会修改指针本身。
答案 4 :(得分:0)
char const * (char const *)
:您无法通过此指针更改此指向的值。 Ergo:常量指针。
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;
}
答案 5 :(得分:0)
作为额外的好处,请阅读Effective STL以正确使用STL。
答案 6 :(得分:0)
这里有两个不同的东西,一个指针和它指向的数据,const
可用于其中一个或两个。
const
char *p = "hello";
++p; // Changes the pointer, now points to 'e'
*p = 'u'; // Changes the data, now "hullo"
const
正如@tc所说,请向后阅读声明。
您可以更改指针,但不能更改指向
的数据// 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您可以更改“hello”,但不能更改指针
char * const p = "hello"; // Constant pointer to char
++p; // Won't compile
*p = 'u'; // OK
您可以同时使用
char const * const p = "hello"; // Constant pointer to constant char
++p; // Wont' compile
*p = 'u'; // Wont' compile