2012-04-08 66 views
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; 
} 

上述程序无法监守的“点心++”,但我不明白为什么。正如我理解的数组,它们由指针(“小吃”)和对象([])两部分组成,所以“零食++”不应该像我递增指针一样工作?

感谢 丹

+1

数组不是由指针和对象组成的。你为什么要改变“零食”的价值?用你自己的话说,你会改变阵列! – 2012-04-08 08:58:48

+0

这是什么意思加一个数组的值并将结果存储在数组中? – 2012-04-08 09:16:26

回答

5

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

如果你想使用指针算法:
a。你应该定义一个指向数组开始的指针并使用它,而不是使用数组。 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++; 
} 
2

你不能改变的snacks值。 您应该使用指针而不是snacks

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

3

尽管可以使用数组作为指针,但它不是编译器中的指针。因此您无法更改snacks变量。如果你被允许改变“指针”,它不会在循环之后“指向”数组的开始,而是在超出未初始化内存的数组之外的入口。

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

4

snacks不是指针。它的类型是CandyBar[3]而不是CandyBar*。然而,数组转换为指针很容易:

CandyBar* snackIterator = snacks; 

(你应该是你正在使用指针是明确的:有很多用途,这使得themsomewhat混乱)。

+0

如果我拿走零食[我]和循环,并改变为零食 - >重量的作品,以便告诉我零食是一个指针,所以我仍然不明白为什么零食++会抛出一个错误? – Dan 2012-04-08 09:10:38

+0

@Dan不会告诉你'snacks'是一个指针,它告诉你指针取消引用语法对数组变量起作用,并且该数组变量被允许自动转换为指针。这可能听起来很挑剔,但实际上数组和指针之间存在巨大差异;指针是简单的数字对象,就像存储数值(地址值)的int/char一样,而数组则是代表多个对象的较大的“块”(“块”)内存。增加一个指针(一个数字)是有道理的,但增加一个数组不会。 – 2012-04-08 10:03:32

+0

@丹:只是因为你可以在某些方面使用数组,像指针并不意味着它是一个指针。你也可以在某些方面使用像数组一样的指针(即下标运算符也可以在指针上工作),但它们不是数组。编程中的实体每个都有一些接口,尽管接口可能有一些重叠,但它们并不相同。 – 2012-04-08 10:46:20

0

snakes作为列表中的第一项开始。您使用snacks[[i]来索引该列表。但是您也将目标帖子移至列表中的第一项,snacks[++因此,您可以使用阵列中的下一项作为凝视点。即存在您的问题。做一个或另一个。

+0

我刚刚添加想测试我对这个数组指针的假设是否正确,因此我只是将它添加到循环中。如果我拿走零食[我]和环,并改变为零食 - >重量的作品,以便告诉我零食是一个指针,所以我仍然不明白为什么零食++会抛出一个错误? – Dan 2012-04-08 09:10:10

+1

因为零食不能改变。它是一个数组,“小吃”是指向数组第一个元素的指针,将它解释为'&snacks [0]'的简写形式。 – ShinTakezou 2012-04-08 09:12:56

+0

ahhh现在可以理解 – Dan 2012-04-08 09:15:14