AR89
AR89

Reputation: 3628

pointer arithmetic with pointer to array

I'm trying to do pointer arithmetic with a pointer to array, but I get a wrong value since I can't dereference the pointer properly. Here is the code:

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

  int main()
  {
  int a[] = {10, 12, 34};

  for (int i = 0; i < 3; ++i)
  {
      printf("%d", a[i]);
  }
  printf("\n");

  int (*b)[3] = &a;
  for (int i = 0; i < 3; ++i)
  {
      printf("%d", *(b++));
  }
 printf("\n");

  return 0;
  }

In the second for I can't get to print the correct value.

It doesn't work even if I write

printf("%d", *b[i]);

I'd like to see how to print correctly using the b++ and the b[i] syntax.

Upvotes: 0

Views: 174

Answers (3)

4pie0
4pie0

Reputation: 29724

You have declared b to be a pointer to arrays of 3 integers and you have initialized it with address of a.

int (*b)[3] = &a;

In the first loop you will print the first element of a array but then you will move 3*sizeof(int) and trigger undefined behavior trying to print whatever there is.

To print it correctly:

int *b = a;
// int *b = &a[0];    // same thing
// int *b = (int*)&a; // same thing, &a[0] and &a both points to same address,
                      // though they are of different types: int* and int(*)[3]
                      // ...so incrementing they directly would be incorrect,
                      // but we take addresses as int* 
for (int i = 0; i < 3; ++i)
{
    printf("%d", (*b++));
}

Upvotes: 1

iammowgli
iammowgli

Reputation: 157

The following should work:

printf("%d\n", *( *b+i ));

// * b + i will give you each consecutive address starting at address of the first element a[0].
// The outer '*' will give you the value at that location.

instead of:

printf("%d", *(b++));

Upvotes: 1

Rob Latham
Rob Latham

Reputation: 5223

gcc will complain about the formatting in the second for loop: it will tell you format specifies type 'int' but the argument has type 'int *

your assignment of a to b should look like this:

int *b = a

Upvotes: 0

Related Questions