Would they work differently on C and C++?
-
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 Answers
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.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;
}

- 883
- 6
- 16
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++.

- 623
- 3
- 9
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++.

- 223,364
- 34
- 402
- 480
-
Could you initialise it and give an example how the accessing of elements would work please? (I hope this is the way to reply to an answer :) ) – Raghav Sharma Sep 11 '14 at 15:01
-
@RaghavSharma `int* a[5]; int* b=a[0]; int b[5]; int (*c)[5]=&b; int y=(*c)[0]` – IdeaHat Sep 11 '14 at 15:04
-
-
@RaghavSharma : #include
int main() { int b = 3; int c = 4; int *a[2] = {&b, &c}; printf("value pointed to by a[0] = %d, by a[1] = %d\n", *a[0], *a[1]); return 0; } – Abhishek Choubey Sep 11 '14 at 15:07 -
-
1In the above example, for pointer `p`, can we let it point to array of size greater than 5 or is it restricted to only size 5 throughout the whole program? – The Room Jun 10 '18 at 23:19
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.

- 12,528
- 4
- 33
- 46