2012-04-08 11 views
2

C++の新機能です。私は質問をしています。 「++スナック」上記のプログラムは、のbecuase失敗なぜポインタがインクリメントしていないのですか

#include <iostream> 
using namespace std; 

int main (void){ 
struct CandyBar{ 
    char brandName[200]; 
    float weight; 
    int calories; 
}; 

CandyBar snacks[3] = { 
    {"Cadbury's Flake",23.5,49}, 
    {"Cadbury's Wispa",49.3,29}, 
    {"Cadbury's Picnic",57.8,49}, 
}; 

for(int i=0;i<3;i++){ 
    cout << "Brand Name: " << snacks[i].brandName << endl; 
    cout << "Weight: " << snacks[i].weight << endl; 
    cout << "Calories: " << snacks[i].calories << endl; 
    snacks++; 
} 

cin.get(); 
return 0; 
} 

が、私は理由を理解することはできません。私が書いた1つのプログラムが、構造体や配列の使用を含みます。私は配列を理解しているので、ポインタ( "スナック")とオブジェクト([])の2つの部分で構成されているので、ポインタをインクリメントしているので "snacks ++"

おかげ ダン

+1

配列はポインタとオブジェクトではありません。なぜあなたは 'スナック 'の価値を変えたいのですか?あなた自身の言葉では、あなたは配列を変えるでしょう! –

+0

配列の値に1を加え、その結果を配列に格納するのはどういう意味ですか? –

答えて

5


あなたはすでに配列内のインデックスとして変数iを使用しています。

ポインタ演算を使用したい場合:
a。配列の先頭へのポインタを定義して、配列で作業するのではなく、その配列で作業する必要があります。
b。データにアクセスするときは、インデックスiの配列の代わりにポインタを使用する必要があります。

2

あなたはsnacksの値を変更することはできません。 snacksの代わりにポインタを使用する必要があります。

あなたのケースではiを増やしている間は、ポインタを大きくする必要はありません。

3

ポインタを配列として使用することはできますが、コンパイラのポインタではありません。したがって、snacks変数を変更することはできません。 "ポインタ"を変更することが許されていれば、ループの後ではなく、初期化されていないメモリである配列を超えたエントリに、もはや配列の先頭に「指す」ことはありません。

また、snacks変数を変更する必要はありません。snacks[i]は既に正しい値を取得しています。

4

snacksはポインタではありません。そのタイプはCandyBar[3]ではなく、CandyBar*です。しかし、配列は本当に簡単ポインタに変換します。

CandyBar* snackIterator = snacks; 

(あなたはあなたのためにポインタを使用しているものを明確にする必要があります:themsomewhatは混乱になり、多くの用途があります)。

+0

スナックとループを取り除いて、スナック - >体重に変えてスナックがポインタであることを知らせるので、スナックがなぜエラーをスローするのかまだ分かりません。 – Dan

+0

@Dan noそれは 'snacks'がポインタであるとは言わないが、ポインタ逆参照構文が配列変数に作用し、その配列変数が自動的にポインタにキャストできることを伝える。それはニッキーピッキーに聞こえるかもしれませんが、実際には配列とポインタの間には大きな違いがあります。ポインタは数値(アドレス値)を格納するint/charのような単純な数値オブジェクトですが、配列は複数のオブジェクトを表すメモリのより大きな "チャンク"( "ブロック")です。ポインタ(数値)をインクリメントすることは意味がありますが、配列をインクリメントすることは意味がありません。 –

+0

@ Dan:ポインタのようないくつかの側面で配列を使うことができるのは、それがポインタであるという意味ではないからです。いくつかの側面で配列のようなポインタを使うこともできます(つまり、添字演算子はポインタでも動作します)が、配列はありません。プログラミングのエンティティにはそれぞれインターフェイスがあり、インターフェイスには重複がありますが、同じではありません。 –

0

snakesは、リストの最初の項目として開始します。そのリストにインデックスを付けるにはsnacks[[i]を使用します。しかし、ゴールポストをsnacks[++でリストの最初の項目に移動すると、配列の次の項目が凝視点として使用されます。つまり問題があります。どちらか一方をしてください。

+0

私はこの配列ポインタについての私の仮定が正しいかどうかをテストしたいので、ループに追加しました。私がスナックとループを取り除いてスナック - >体重に変わると、スナックがポインタであることがわかります。なぜスナックがエラーをスローするのかまだ分かりません。スナックは変更できないため、 – Dan

+1

です。これは配列で、 'snacks'は配列の最初の要素へのポインタで、'&snacks [0] 'の短縮形のように解釈します。 – ShinTakezou

+0

ahhh今理解しました – Dan

関連する問題