无法通过指针访问对象数组

时间:2016-02-17 04:37:32

标签: c++

我正在制作一个包含Movie类的程序,其中包含title,criticRating和audienceRating。我有一个静态数组,我正在创建一个名为PrintMovies的函数,它将电影数组打印成一个漂亮的表。除了数组中的第一个元素之外,我无法访问其他元素以打印到表格中。

非常感谢任何帮助!

这是我到目前为止所做的:

#include <iostream>
#include <string>
#include <iomanip>

using std::cout;
using std::endl;
using std::string;
using std::setw;

struct Movie {
    std::string title;
    int criticRating; // from 0 to 100
    int audienceRating; // from 0 to 100

    Movie(string t, int c, int a) {
        title = t;
        criticRating = c;
        audienceRating = a;
    }

    Movie() {                       // Default constructor
        title = "DEFAULT TITLE";
        criticRating = 0;
        audienceRating = 0;
    }


};

void PrintMovies(Movie* movies, int numMovies) {

    cout << "Movies" << endl;
    cout << "Critic    Audience    Title" << endl;
    for (int i = 0; i < numMovies; i++) {
        cout << setw(6) << (movies->criticRating) << setw(12) << (movies->audienceRating) << "    " << (movies->title) << endl;
    }

}

int main() {

    Movie TenMovies[10] = { Movie("Star Wars: Episode VII - The Force Awakens",92,90),
        Movie("Deadpool",83,95), Movie("Donnie Darko",85,80),
        Movie("2001: A Space Odyssey",96,89), Movie("Spaceballs",54,83),
        Movie("The Matrix",87,85), Movie("Inception",86,91),
        Movie("The Martian",92,92), Movie("Toy Story",100,92),
        Movie("Monty Python and the Holy Grail",97,95) };

    PrintMovies(TenMovies, 10);

}

3 个答案:

答案 0 :(得分:0)

要访问对象“电影”数组的第ii项中的“criticRating”字段,请使用以下语法:

 movies[i].criticRating

答案 1 :(得分:0)

cout << setw(6) << ((*(movies + i)).criticRating) << setw(12) << ((*(movies + i)).audienceRating) << "    " << ((*(movies + i)).title) << endl;**You are using array for not travesring with array of Movies use this syntax**

答案 2 :(得分:0)

考虑这个的最佳方式就像是一个c风格的字符串。

如果你想打印一个角色,你会做这样的事情 -

char *myStr = "Hello world!";
std::cout << myStr[1] << std::endl;

你猜对了,打印'e',因为'e'的索引是1。

如果您这样说(注意取消引用*) -

,会发生什么

std::cout << *myStr << std::endl;

那将打印'H'。那是因为H位于数组的开头,每当你创建一个新数组时,该数组/指针的地址都是第一个元素。

检查出来 -

0x4050e0 H
0x4050e1 e
0x4050e2 l
0x4050e3 l
0x4050e4 o
0x4050e5
0x4050e6 w
0x4050e7 o
0x4050e8 r
0x4050e9 l
0x4050ea d
0x4050eb !
0x4050ec

这是字符串在不同地址的内存中的样子。

myStr的地址位于0x4050e0,与H相同!如果你要说myStr ++将地址移动到e或0x4050e1。 示例 -

char *myStr = "Hello world!";
myStr++;
std::cout << myStr << std::endl;

那将打印“ello world!”而不是“Hello world!”,因为我们增加了指针。指针指向内存中的位置(或地址),因此增加一个会移动到下一个地址。

话虽如此,有多种方法可以做到这一点。

一个是使用你的i循环变量作为数组索引访问c风格字符串中的单个字符:

for (int i = 0; i < numMovies; i++) {
    cout << setw(6) << (movies[i].criticRating) << setw(12) << (movies[i].audienceRating) << "    " << (movies[i].title) << endl;
}

否则你可以这样做,它可以让你看到为什么指针被称为指针:

for (int i = 0; i < numMovies; i++) {
    cout << setw(6) << (movies->criticRating) << setw(12) << (movies->audienceRating) << "    " << (movies->title) << endl;

    //Increment movies' address to the next Movie in memory.
    movies++;
}