1

重複の可能性:
配列名は C のポインターですか?

そのため、通常はポインターを使用して配列を宣言します。

ただし、角括弧表記を使用して配列を宣言することもできます。

char a[] = "ok" ;
char b[] = "to" ;
char *pa = a ;

cout << "a " << sizeof( a ) << endl ;   // 3
cout << "pa " << sizeof( pa ) << endl ; // 4

奇妙な点は、ポインターsizeof( a )のサイズではなく、配列の実際のサイズ (バイト単位) になることです。

ポインタはどこにあるのでしょうか?(sizeof(char)*numElements)角括弧で宣言された配列は、実際にはバイトを含む一種のデータ構造ですか?

また、a を b に再割り当てすることはできません。

a = b ; // ILLEGAL.

何故ですか?aは配列であり、配列へのポインターではないようです( 「左オペランドは左辺値でなければなりません」は上記のエラーですa = b)。そうですか?

4

4 に答える 4

5

何故ですか?a は配列であり、配列へのポインターではないようです (「左オペランドは左辺値でなければなりません」は上記の a = b のエラーです)。

a確かに配列型であり、ポインター型ではありません。配列は変更できない左辺値であるため、配列に割り当てることはできません。

BTW 配列は、関数に渡されると、最初の要素へのポインターに減衰します。

于 2011-04-06T17:22:01.987 に答える
1

宣言で角かっこを使用すると、実際にはスタックにスペースが割り当てられます。を使用し*てポインタを宣言する場合、単にポインタを宣言しているだけです。それで

char a[] = "ok";

実際にはスタックに3バイトを割り当て、文字列で埋めますok\0。しかし、あなたがそうするなら

char a* = "ok";

ポインタ用に十分なスペースを割り当て、文字列を含むデータセクション内の場所にポインタを設定しますok\0(つまり、定数としてコンパイルされます)。

于 2011-04-06T17:24:08.243 に答える
0

つまり、配列の最初(0番目)の要素への定数ポインターです。

ここの「ポインタと配列」セクションをチェックしてください

于 2011-04-06T17:26:37.540 に答える