7

Would they work differently on C and C++?

Jean-François Fabre
  • 137,073
  • 23
  • 153
  • 219
Raghav Sharma
  • 109
  • 1
  • 1
  • 6
  • One of the key points in the answers in the previous thread is to note that int (*a)[5] could be a pointer to the first row of a matrix that has 5 integers per row, so that a[0] points to the first row, a[1] points to the second row, ... . – rcgldr Sep 11 '14 at 17:39

4 Answers4

17
  1. int *a[5] - It means that "a" is an array of pointers i.e. each member in the array "a" is a pointer
    of type integer; Each member of the array can hold the address of an integer.

  2. int (*a)[5] - Here "a" is a pointer to the array of 5 integers, in other words "a" points to an array that holds 5 integers.

Example :

#include<stdio.h>
   int main()
   {
           int b = 3;
           int c = 4;
           int *a[2] = {&b, &c}; // is same as ---int *a[] = {&b, &c} 
           printf("value pointed to by a[0] = %d, by a[1] = %d\n", *a[0], *a[1]);
           return 0;
   }
Abhishek Choubey
  • 883
  • 6
  • 16
8

Yes, theres a huge difference. Let see some code:

#include <stdio.h>

int main()
{
    int *a[5]; // same as: int *(a[5]);
    int(*b)[5];

    printf("*a[5] vs (*b)[5] : %d vs %d", sizeof (a), sizeof(b));
    // *a[5] vs (*b)[5] : 20 vs 4
}   

What does that mean?

First case (int *a[5]) is array of 5 pointers to int

and second (int(*b)[5]) is pointer to array of 5 ints.

The difference makes here ().

And yes, the behavior is same in C and C++.

Dawid
  • 623
  • 3
  • 9
6

This is an array of 5 pointers to int:

int* a[5];

This is a pointer to an array of 5 ints:

int (*a)[5];

Here's an example of how you could initialize the pointer or the elements of the array of pointers:

int a[5] = {0, 1, 2, 3, 4};
int (*p)[5]; // pointer to array of 5 ints
int* b[5];   // array of 5 pointers to int

p = &a; // p points to a

for (int i = 0; i < 5; ++i)
  std::cout << (*p)[i] << " ";
std::cout << std::endl;

// make each element of b point to an element of a
for (int i = 0; i < 5; ++i)
  b[i] = &a[4-i];

for (int i = 0; i < 5; ++i)
  std::cout << b[i] << " ";
std::cout << std::endl;

Note that although I have used C++ in the example, this applies to C and C++.

juanchopanza
  • 223,364
  • 34
  • 402
  • 480
6

int* a[5] declare a as array 5 of pointer to int

int (*a)[5] declare a as pointer to array 5 of int

I suggest you to use cdecl to understand such or any complex declarations.

Sunil Bojanapally
  • 12,528
  • 4
  • 33
  • 46