0

このウェブサイトで私が持っている質問に最も近い質問には、満足できない回答がいくつかありました。

基本的に、関連する 2 つの質問があります。

Q. 次のようなことをすると:

char a[]= "abcde"; //created a string with 'a' as the array name/pointer to access it.

a[0]='z';  //works and changes the first character to z.

しかし

char *a="abcde";
a[0]='z'; //run-time error.

違いはなんですか?「const」宣言がないので、中身は自由に変更できるはずですよね?

Q. 次のようなことをすると:

int i[3];
i[0]=10; i[1]=20; i[2]=30;
cout<<*++i;  //'i' is a pointer to i[0], so I'm incrementing it and want to print 20.

これにより、コンパイル時にエラーが発生しますが、その理由がわかりません。

一方、これは機能します:

int *i=new int[3];
i[0]=10; i[1]=20; i[2]=30;
cout<<*++i;  //Prints 20.

助けてくれてありがとう。

4

2 に答える 2

1

Q

char *a="abcde";
a[0]='z'; //run-time error.

回答 - ここでaは、読み取り専用の場所に格納されている文字列リテラルを指しています。文字列リテラルは変更できません

Q

int i[3];
i[0]=10; i[1]=20; i[2]=30;
cout<<*++i; 

Ans- Array と Pointers は同じものではありません。ここiはポインターではありません。インクリメントオペランドには左辺値が必要です

できるよ :

int *p = &i[0];
std::cout<<*++p;

最後のケースでは、演算子newは割り当てられたメモリ空間へのポインタを返すため、可能です。

于 2013-10-27T21:04:45.293 に答える
1

質問1

問題は、それがまだ const であることです。

文字列リテラルの実際の型はchar const*です。
しかし、彼らが C++03 を設計したとき、(残念ながら) からchar const*への変換char*はエラーではないと判断しました。したがって、コード:

char *a="abcde";

実際にはエラーなしでコンパイルされます (文字列が const であっても)。しかし、文字列リテラルは、非 const ポインターを介して指されていても、まだ const です。したがって、非常に危険です。

良いニュースは、ほとんどのコンパイラが警告を生成することです:

警告: 文字列定数から 'char*' への非推奨の変換</p>

質問2

cout<<*++i;  //'i' is a pointer to i[0], so I'm incrementing it and want to print 20.

この時点で、i はポインターではありません。その型はまだ配列です。
配列をインクリメントするのは有効な操作ではありません。

あなたが考えていること; 配列は、ハットのドロップでポインターに崩壊します(関数に渡すときのように)。残念ながら、この状況ではそれが起こっていないため、配列をインクリメントしようとしています (これは意味がありません)。

于 2013-10-27T21:05:56.960 に答える