2011-07-25 8 views
4

私は大学からC++についての講義を見てきましたが、私は多くを学んでいますが、まだ理解できないものは次のとおりです。char *とは何ですか?

なぜこれを行う必要がありますか?私が見た/読んだから

char* test = "testing"; 

あなたが*を置くために持っている理由、私は理解していません。私が理解したと思ったところから、アドレスがある場合は*を使用しますが、たぶん私はちょうど間違っています。

+2

これは厳密には正しくないので、 'const char * test =" testing ";'と言うべきです。文字列リテラルは、* constant * charsへのポインタです。 –

+3

@Kerrek:実際には、文字列リテラルは、定数charへのポインタに* decay *することができる定数char配列です。 – fredoverflow

+0

@Fred:はい、さらに良い! –

答えて

13

これはcharです:

char c = 't'; 

それは一度にアクター1 charを保持することができます! :)


これは、C-文字列です:

char sz[] = "test"; 

それはちょうど charアクター以上のものを "ホールド" することができます。


複数char Sのシーケンスのメモリ位置へchar*ポイント。

char sz[] = {'t', 'e', 's', 't', 0}; 

const char *psz = "test"; 

お知らせ:

*psz == 't'; 
*(psz + 1) == 'e'; 
*(psz + 2) == 's'; 
*(psz + 3) == 't'; 
*(psz + 4) == 0; // NUL 

そして:

sz[0] == 't'; 
sz[1] == 'e'; 
sz[2] == 's'; 
sz[3] == 't'; 
sz[4] == 0; // NUL 
+0

文字列を終了するのに ''\ 0''または' 0'を使うことがあります。 'NULL'はヌルポインタ定数であり、文字列ターミネータではありません。 –

+0

@Rob画像にバックスラッシュを入れたくないので、「0」を使用します。 (「NULL」は意図をよりはっきりと示していると思うが。) –

+0

@ muntoo:ゼロビットキャラクタのASCII名である 'NUL'を使用したいと思います。 –

4

char型は、単一の文字のみを表すことができます。一連の文字があると、それらはメモリ内で隣り合わせに積み重なり、そのシーケンスの最初の文字の位置が返されます(テストに割り当てられます)。 Testは、 "testing"の最初の文字のメモリ位置へのポインタであり、ポインタが指している型はchar型であると言っています。

-3

Cでは、配列はその中の最初の要素へのポインタで表されます。

+8

いいえ、そうではありません。 [配列はポインタではありません](http://stackoverflow.com/questions/4810664/)。 – fredoverflow

+1

私はそれらがポインタであるとは言いません – Mythli

0

char*char年代のメモリの連続ブロックの先頭のアドレスを表します。あなたはこれをアクセスする場合、関数は最初charのアドレスを取得し、メモリをステップ実行しますcharさん

の配列全体に取り組んでいる単一char変数を使用していないとして、あなたはそれを必要とします。これは、アレイが連続したメモリを使用する(すなわち、メモリのすべてがメモリ内で連続している)ので可能である。

これが問題を解決することを願っています。 :)

1

*を使用すると、この変数がメモリ内の場所を指していることがわかります。この場合、文字列 "testing"の位置を指しています。 charポインタを使用すると、単一の文字に限定されるわけではありません。これは、利用可能なスペースが増えたためです。

char *test = "testing"; 

か::

char test[] = "testing"; 

か、のようなものをテーマにいくつかのバリエーション:

char const *test = "testing"; 

私が主な理由は、これを言及

3

あなたは、2つのいずれかを行うことができますそれはあなたがいつも本当に欲しいものです。

一番下の行は、しかし、char x;は単一の文字を定義することです。文字列が必要な場合は、charの配列またはcharへのポインタを定義する必要があります(上記のように文字列リテラルで初期化します)。

はかかわらず、最初の2つのオプションの間に本当の違いがあります。 char *test=...は、testという名前のポインタを定義します。このポインタは文字列リテラルを指すように初期化されています。文字列リテラル自体は静的に(通常はプログラムのコードと一緒に)割り当てられます。あなたはそれを変更しようとしていません。つまり、char const *の設定です。

char test[] = ..アレイを割り当てます。むしろ、testは、文字列リテラル自体に添付名になり - 。それはグローバルだ場合、それはリテラル文字列へのポインタのための別々のスペースを割り当てていないことを除いて、前にかなり似ています

ローカル変数としてこれを行うと、testは引き続き文字列リテラルを直接参照しますが、ローカル変数であるため、(通常はスタック上に)「自動」ストレージを割り当てます。静的に割り当てられた文字列リテラル)を、定義されているブロック/スコープへのすべてのエントリに追加します。

後者のバージョン(charの配列を持つ)は、ポインターと似たような働きをする可能性があります。なぜなら、配列名は関数に渡すときはいつでも、配列の先頭のアドレスに減衰するからです。しかし、違いがあります。配列を変更できますが、文字列リテラルを変更すると未定義の動作が発生します。逆に、あなたには、いくつかの他のchar sで指すようにポインタを変更することができますので、何かのように:

char *test = "testing"; 

if (whatever) 
    test = "not testing any more"; 

...「配列が上がらない(完全に罰金ですが、配列と同じことをやろうとすると、動作しません。割り当て可能)。

0

の人が言及するのを忘れてしまった主なものは、"testing"は、メモリ内の文字の配列である、C++の中にはそのようなものなどのプリミティブ文字列型がありませんということです。したがって、他の配列と同様に、それが要素であるかのように参照することはできません。

関連する問題