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 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などの関数で内容を修正することができます.
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
結論は以下の通りです