新聞中心
本篇文章重點為大家講解一下const char*, char const*, char*const 的區(qū)別,有需要的小伙伴可以參考一下。

Bjarne在他的The C++ Programming Language里面給出過一個助記的方法:把一個聲明從右向左讀。
char * const cp; ( * 讀成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;
char const * p;
同上因為C++里面沒有const*的運算符,所以const只能屬于前面的類型。
C++標(biāo)準規(guī)定,const關(guān)鍵字放在類型或變量名之前等價的。
const int n=5; //same as below
int const m=10;
const int *p; //same as below const (int) * p
int const *q; // (int) const *p
char ** p1;
// pointer to pointer to char
const char **p2;
// pointer to pointer to const char
char * const * p3;
// pointer to const pointer to char
const char * const * p4;
// pointer to const pointer to const char
char ** const p5;
// const pointer to pointer to char
const char ** const p6;
// const pointer to pointer to const char
char * const * const p7;
// const pointer to const pointer to char
const char * const * const p8;
// const pointer to const pointer to const char
說到這里,我們可以看一道以前Google的筆試題:
const char *p="hello";
foo(&p); // 函數(shù)foo(const char **pp)下面說法正確的是[]
A.函數(shù)foo()不能改變p指向的字符串內(nèi)容。 B.函數(shù)foo()不能使指針p指向malloc生成的地址。 C.函數(shù)foo()可以使p指向新的字符串常量。 D.函數(shù)foo()可以把p賦值為 NULL。
至于這道題的答案是眾說紛紜。針對上面這道題,我們可以用下面的程序測試:
#include
#include
#include
void foo(const char **pp)
{
// *pp=NULL;
// *pp="Hello world!";
*pp = (char *) malloc(10);
snprintf(*pp, 10, "hi google!");
// (*pp)[1] = 'x';
}
int
main()
{
const char *p="hello";
printf("before foo %s/n",p);
foo(&p);
printf("after foo %s/n",p);
p[1] = 'x';
return;
}
結(jié)論如下:
-
在foo函數(shù)中,可以使main函數(shù)中p指向的新的字符串常量。
-
在foo函數(shù)中,可以使main函數(shù)中的p指向NULL。
-
在foo函數(shù)中,可以使main函數(shù)中的p指向由malloc生成的內(nèi)存塊,并可以在main中用free釋放,但是會有警告。但是注意,即使在foo中讓p指向了由malloc生成的內(nèi)存塊,但是仍舊不能用p[1]=’x’;這樣的語句改變p指向的內(nèi)容。
-
在foo中,不能用(*pp)[1]=’x’;這樣的語句改變p的內(nèi)容。
所以,感覺gcc只是根據(jù)const的字面的意思對其作了限制,即對于const char*p這樣的指針,不管后來p實際指向malloc的內(nèi)存或者常量的內(nèi)存,均不能用p[1]=’x’這樣的語句改變其內(nèi)容。但是很奇怪,在foo里面,對p指向malloc的內(nèi)存后,可以用snprintf之類的函數(shù)修改其內(nèi)容。
新聞名稱:講解一下constchar*,charconst*,char*const的區(qū)別
標(biāo)題URL:http://fisionsoft.com.cn/article/djjgpjj.html


咨詢
建站咨詢
