2

作为 C++ 的新手,我一直在练习提问。我编写的一个程序包括使用结构和数组:

#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”)和对象([])两部分组成,所以当我增加指针时,“snacks++”不应该工作吗?

谢谢丹

4

5 回答 5

5

just remove the snacks++;
you are already using the variable i as a index in the array.

if you do want to use a pointer arithmetics:
a. you should define a pointer to the start of the array and work with it rather then work with the array.
b. you should use a pointer instead of the array with index i when accessing the data.

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 回答