日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
講解一下constchar*,charconst*,char*const的區(qū)別

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

Bjarne在他的The C++ Programming Language里面給出過一個(gè)助記的方法:把一個(gè)聲明從右向左讀。

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;

同上因?yàn)镃++里面沒有const*的運(yùn)算符,所以const只能屬于前面的類型。

C++標(biāo)準(zhǔn)規(guī)定,const關(guān)鍵字放在類型或變量名之前等價(jià)的。

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。

至于這道題的答案是眾說紛紜。針對(duì)上面這道題,我們可以用下面的程序測(cè)試:

#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é)論如下:

  1. 在foo函數(shù)中,可以使main函數(shù)中p指向的新的字符串常量。
  2. 在foo函數(shù)中,可以使main函數(shù)中的p指向NULL。
  3. 在foo函數(shù)中,可以使main函數(shù)中的p指向由malloc生成的內(nèi)存塊,并可以在main中用free釋放,但是會(huì)有警告。但是注意,即使在foo中讓p指向了由malloc生成的內(nèi)存塊,但是仍舊不能用p[1]=’x’;這樣的語句改變p指向的內(nèi)容。
  4. 在foo中,不能用(*pp)[1]=’x’;這樣的語句改變p的內(nèi)容。

所以,感覺gcc只是根據(jù)const的字面的意思對(duì)其作了限制,即對(duì)于const char*p這樣的指針,不管后來p實(shí)際指向malloc的內(nèi)存或者常量的內(nèi)存,均不能用p[1]=’x’這樣的語句改變其內(nèi)容。但是很奇怪,在foo里面,對(duì)p指向malloc的內(nèi)存后,可以用snprintf之類的函數(shù)修改其內(nèi)容。


分享名稱:講解一下constchar*,charconst*,char*const的區(qū)別
新聞來源:http://www.dlmjj.cn/article/djjgpjj.html