1

I'm confused on how to use pointer notation to access a struct used with malloc. I can use array notation but what's the syntax on pointer?

  #include "stdio.h"
#include "stdlib.h"

using namespace std;

typedef struct flightType  {

    int altitude;
    int longitude;
    int latitude;
    int heading;

    double airSpeed;

} Flight;

int main() {

    int airbornePlanes;
    Flight *planes;

    printf("How many planes are int he air?");
    scanf("%d", &airbornePlanes);

    planes =  (Flight *) malloc ( airbornePlanes * sizeof(Flight));
    planes[0].altitude = 7;  // plane 0 works

    // how do i accessw ith pointer notation
    //*(planes + 1)->altitude = 8; // not working
    *(planes + 5) -> altitude = 9;
    free(planes);

}
2
  • I'm receving error - main.cpp|34|error: request for member 'altitude' in '(planes + 120u)', which is of non-class type 'Flight*'| ||=== Build finished: 1 errors, 0 warnings ===| Commented Oct 23, 2012 at 16:57
  • 1
    If this is a c code, please use stdio instead of iostream and namespace. Those are of C++. Commented Oct 23, 2012 at 16:57

3 Answers 3

2

Basically x->y is shorthand for (*x).y.

The following are equivalent:

(planes + 5) -> altitude = 9

and

(*(planes + 5)).altitude = 9;

and

planes[5].altitude = 9;

A more concrete example:

Flight my_flight; // Stack-allocated
my_flight.altitude = 9;

Flight* my_flight = (Flight*) malloc(sizeof(Flight)); // Heap-allocated
my_flight->altitude = 9;
Sign up to request clarification or add additional context in comments.

7 Comments

When do i use -> or periods?
When i use *(planes +5) - i'm getting - |error: invalid type argument of 'unary *'| ||=== Build finished: 1 errors, 0 warnings ===|
I'm sorry, I missed a pair of parentheses. If you think that's ugly, then you know why you got the -> syntax ;)
@StarPilot Ooh, this is not correct! You might like to read here: stackoverflow.com/q/394767/694576
@StarPilot Pointer arithmetics would take the size of a Flight struct into account.
|
1

You don't need the -> notation for this, because you are already dereferencing the pointer using the asterisk. Simply do:

*(places + 5).altitude = 5;

The -> is shorthand for "dereference this struct pointer and access that field", or:

(*myStructPointer).field = value;

is the same as

myStructPointer->field = value;

You can use either notation, but (should) not both at the same time.

Comments

0

You need an extra parenthesis after dereferencing the pointer.

(*(planes + 5)).altitude = 9;

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.