2012-03-12 21 views
5

へのポインタを作り、私はchar配列が定義されています。これは正しいポインタを使用する場所ですか?C++は、C++でchar配列

私の質問は、このchar配列へのポインタを作る正しい方法は何ですか。私はちょうど最初の要素へのポインタを作成し、私は私が最後の文字を打つまで、私はメモリを介してステップの値を変更したいですか?

+0

これを見ただけで、\ 0よりもずっと優れています。ありがとう –

答えて

14
char miniAlphabet[] = {'A','B','C','D','E', '\0'}; 

これらは同等です。

char *p1 = miniAlphabet; 

char *p2 = &(miniAlphabet[0]); 

()はオペレータの優先順位のために役に立たないことに注意してください、C/C中のSO

char *p3 = &miniAlphabet[0]; 

++配列の名前が配列の最初の要素へのポインタです。あなたはその後、いくつかの魔法を行うには、ポインタ数学を使用することができます

...

これは、第二の要素を指すようになります:

char *p4 = &miniAlphabet[0] + 1; 

char *p5 = &miniAlphabet[1]; 

または

char *p6 = miniAlphabet + 1; 

のような
+0

編集、v.clearありがとう。 –

+0

こんにちは、私は簡単な質問があります。 char * p1 = miniAlphabetを実行すると、p1は配列の最初の要素のアドレスを格納するようになりました。どのようにして、cout << p1 << endlを実行すると、最初の要素のアドレスではなく、char配列全体(この場合はABCDE)が得られますか? –

+0

@DannyBrown * cout *の作成者が決定したためです。すべてのchar *ポインタに "hello world"という文字列を書くことさえあったかもしれませんが、それはばかげているでしょう。あなたが文字を書いている職業であれば、最も知的なことは、char *を文字列として出力することです。ポインタアドレスを出力したい場合は、次のようにしてください。* << static_cast (p1)* – xanatos

1

poメモリ内の配列の位置は、最初の要素の位置と同じです。したがって、たとえば、両方の関数のシグネチャは以下と等価です:

function changeArray(char[] myArray); 
function changeArray(char* myArray); 

そして、あなたはどちらのバージョンのように呼び出すことができます:あなたは配列を渡すと

changeArray(miniAlphabet); 

...または

changeArray(&(miniAlphabet[0])); 
+0

char *は宣言の定数であるという印象を受けました。この場合、2番目の関数はchar配列について何も変更できないでしょうが、最初の関数はできますか? – MintyAnt

+0

関数内でchar *の値を変更することはできませんが、この場合は配列を指す値を変更することができます。したがって、両方の宣言によって元の配列に変更が可能です。 – Diego

1

関数には、配列変数として参照渡しされるのは、実際には配列の最初の要素のアドレスへのポインタです。

funcName(miniAlphabet); 

をして、このような「参照によって」配列を受け取ります:だから、このように関数を呼び出すことができ

void funcName(char *miniAlphabet) { 
    ... 
} 
1

を一言で言えば、はい。配列を作成するときは、定義したサイズと型の配列へのポインタです。これはまた、最初の要素へのポインタです。

あなたが提案している例です。

void foo(char *array) 
{ 
    array[0] = 'z'; 
    array[2] = 'z'; 
} 

... 

char myArray[] = { 'a', 'b', 'c'}; 
foo(myArray); 
//myArray now equals {'z', 'b', 'z'} 

また、dereferencing myArrayは、最初の要素の値を返します。