const char*,char const*,char*constについて

2549 ワード

http://www.x-boy.com/article.asp?id=32
const char*、char const*、char*constの違いはほとんどC++面接のたびに問題があります.実はこの概念は誰でも持っています.ただ3つの声明の方式がとても似ていて覚えやすいです.Bjarneは彼のThe C++Prograamming 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++標準規定により、constキーワードはタイプまたは変数名の前に置くと等価となります.
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)//関数foo(const char**p p)は、以下の言い方が正しいのは、[]A.関数foo()pが指す文字列の内容B.関数foo()が、malloが生成したアドレスC.関数foo()にポインタpを向けられないようにすると、pが新しい文字列定数D.関数foo()に向けられます.pはNULLに値が付けられます.
この問題の答えは諸説あります.上記の問題に対して、次の手順でテストできます.
璜include萼include萼includevoid foo(const char*pp)    *pp=NULL//    *pp=「ハローワールド!」        *pp=(char*)mallo c(10);        snprintf(*pp,10,hi google!);       (*pp)[1]='x';intmail()    const char*p=「ハロー」    printf(「before foo%s」、p)    foo(&p);    printf(「after foo%s」、p)    p[1]='x';    リターン;
結論は以下の通りです
  • は、foo関数において、main関数のpが指す新しい文字列定数を使用することができる.
  • は、foo関数において、main関数のpをNULLに向けることができる.
  • は、foo関数において、mallo関数のpをmalloによって生成されたメモリブロックを指すことができ、mainにfreeでリリースすることができますが、警告があります.ただし、fooではmallocによって生成されたメモリブロックをpに向けられても、p[1]='x';はまだ使えません.このような文はp指しの内容を変えます.
  • fooでは、(*pp)[1]='x'は使えません.このような文はpの内容を変えます.
  •       だから、gccはconstの字面の意味によって限定されているような気がします.つまり、const char*pのようなポインタについては、pが実際にmallocのメモリや定数のメモリを指しても、p[1]='x'という語句で内容が変えられません.しかし、fooの中でpに対してmallocのメモリを指すと、snprintfなどの関数で内容を修正することができます.