为什么指针不递增

时间:2012-04-08 08:52:54

标签: c++ arrays struct

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

上述程序失败了,因为“零食++”,但我不明白为什么。据我所知,数组它们由指针(“零食”)和对象([])两部分组成,所以当我递增指针时,“snack ++”不应该起作用吗?

由于 丹

5 个答案:

答案 0 :(得分:5)

只需删除snacks++;
您已经使用变量i作为数组中的索引。

如果你想使用指针算术:
一个。你应该定义一个指向数组开头的指针并使用它,而不是使用数组 湾在访问数据时,您应该使用指针而不是索引为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++;
}

答案 1 :(得分:4)

snacks不是指针。其类型为CandyBar[3]而非CandyBar*。但是,数组转换为指针非常简单:

CandyBar* snackIterator = snacks;

(你应该清楚你使用的指针是什么:有很多用途使得这些令人困惑)。

答案 2 :(得分:3)

虽然可以使用数组作为指针,但它不是编译器中的指针。因此,您无法更改snacks变量。如果你被允许更改“指针”,它将不再“指向”循环后数组的开头,而是指向数组之外的未初始化内存的条目。

此外,您无需更改snacks变量,snacks[i]已为您提取正确的值。

答案 3 :(得分:2)

您无法更改snacks的值。 您应该使用指针而不是snacks

在你的情况下增加i时,你不需要增加指针。

答案 4 :(得分:0)

snakes作为列表中的第一项开始。您使用snacks[[i]索引该列表。但是你也可以使用snacks[++将目标帖子转移到列表中的第一个项目。因此,您可以使用数组中的下一个项目作为凝视点。即你的问题。做其中一个。