user1592989
user1592989

Reputation:

What does (*ptr)[10] mean?

void main()
{
    int (*d)[10];
    d[0] = 7;
    d[1]=10;
    printf("%d\n",*d);
}

It should print 10 but compiler is showing error such as follows:

test.c:4:7: error: incompatible types when assigning to type ‘int[10]’ from type ‘int’

Note that I have included some errors , not all.

Upvotes: 2

Views: 13407

Answers (5)

mutoso
mutoso

Reputation: 31

d is a pointer to an array of 10 ints.

int (*d)[10] is the declaration for a point to an array of 10 ints.

vs.

int *d[10], which is an array of 10 int pointers.

For more complex syntax like this (usually involving pointers), I use cdecl to help me decode it.

Upvotes: 1

mihirj
mihirj

Reputation: 1219

Concept of pointer can get confusing sometimes in C.

Consider an array int d[6] = {0,1,2,3,4,5}

Then, *d is equivalent to d[0]. d is itself an pointer to an array and *d dereferences that pointer and gives us the value.

Hence, following code would print the same values:

int main()
{
    int (d)[10];
    *d = 7;
    *(d + 1)=10;
    printf("%d\n",*d);
    printf("%d\n",d[0]);
    return 0;
}

result:

7
7

Please see http://codepad.org/LYY9ig1i.

If you change your code as follows:

#include<malloc.h>
int main()
{
    int *d[10]; //not (*d)[10]
    d[0] = (int *)malloc(sizeof(int *) * 10);
    d[0][0] = 7;
    printf("%d\n",d[0][0]);
    return 0;
}

Hope this helps you!

Upvotes: 0

ChaoSXDemon
ChaoSXDemon

Reputation: 910

In C, [] is the same as *, the pointer syntax. Thus the following lines are the same:

int** array2d1;
int* array2d2[];
int array2d3[][];

To relate to a closer example, the main function has the following popular forms:

int main(int argc, char** argv){ ... }

or

int main(int argc, char* argv[]){ ... }

Thus

int (*d)[10]

is the same as

int* d[10]

which is the same as

int** d;
int firstArray[10];
d = &firstArray;

Effectively, you are creating a pointer to a pointer (which is a pointer to an array) and allocating the first pointer to an array that 10 elements. Therefore, when you run the following lines:

d[0] = 7;
d[1] = 10;

You are assigning the 1st array's address to 7 and the second array's address to 10. So as Joachim has mentioned, to assign values, you need to deference twice:

(*d)[0] = 7
(*d)[1] = 10

Which says "Assign 7 to the 0th index at the value pointed by d". I hope that makes sense?

Upvotes: 1

Some programmer dude
Some programmer dude

Reputation: 409176

As noted by chris, d is a pointer to an array. This means you use the variable improperly when you access it, but also that you will access random memory unless you assign d to point to a valid array.

Change your program as follows:

int main(void)
{
    int (*d)[10];  /* A pointer to an array */
    int a[10];     /* The actual array */

    d = &a;  /* Make `d` point to `a` */

    /* Use the pointer dereference operator (unary prefix `*`)
       to access the actual array `d` points to */
    (*d)[0] = 7;
    (*d)[1] = 10;

    /* Double dereference is okay to access the first element of the
       arrat `d` points to */
    printf("%d\n", **d);

    return 0;
}

Upvotes: 6

Friedrich
Friedrich

Reputation: 5996

It's used in this form int d[10]

I guess you are mistaken that d must be a "kind of pointer" and therfor you put an * before the d. But that's not what you want. You wan to name an array of integer and the notation for that is seen above.

Upvotes: 0

Related Questions