2

C ++に慣れていないので、質問を練習してきました。私が書いたプログラムの1つに、構造体と配列の使用が含まれています。

#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;
}

上記のプログラムは「snacks++」のために失敗しますが、その理由がわかりません。私が理解しているように、配列はポインター( "snacks")とオブジェクト([])の2つの部分で構成されているので、ポインターをインクリメントしているときに "snacks ++"は機能しないのでしょうか?

ありがとうダン

4

5 に答える 5

5

snacks++;
すでに変数iを配列のインデックスとして使用しているものを削除するだけです。

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

struct CandyBar* ptr = snacks;
for(int i=0;i<3;i++){
    cout << "Brand Name: " << ptr->brandName << endl;
    cout << "Weight: " << ptr->weight << endl;
    cout << "Calories: " << ptr->calories << endl;
    ptr++;
}
于 2012-04-08T09:06:25.777 に答える
4

snacksポインタではありません。そのタイプはではありCandyBar[3]ませんCandyBar*。ただし、配列をポインタに変換するのは非常に簡単です。

CandyBar* snackIterator = snacks;

(ポインタを何に使用しているのかを明確にする必要があります。ポインタをやや混乱させる多くの用途があります)。

于 2012-04-08T08:58:53.010 に答える
3

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

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

于 2012-04-08T08:58:21.150 に答える
2

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

そして、あなたがあなたの場合に増加している間、あなたはポインタを増やす必要はありませんi

于 2012-04-08T08:55:11.303 に答える
0

snakesリストの最初の項目として開始します。snacks[[i]そのリストにインデックスを付けるために使用します。ただし、ゴールポストをリストの最初のアイテムにシフトします。snacks[++したがって、配列内の次のアイテムを開始点として使用します。つまり、あなたの問題があります。どちらかを実行します。

于 2012-04-08T08:59:48.573 に答える