Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Casting pointer to Array (int* to int[2])

How do I cast or convert an int* into an int[x]?

First, I know that pointers can be indexed. So I know that I can loop through the pointer and array and manually convert the pointer. (eg. a for loop with arr[i] = p[i]). I want to know if the same result can be achieved in fewer lines of code.

As an example I tried to cast pointer int* c = new int[x] to an array int b[2]

int a    = 1; int b[2] = { 2, 3 }; int* c   = new int[b[1]];  c[0] = b[0]; c[1] = b[1]; c[2] = a; 

I wanted to see what values were where, so I made a simple program to output addresses and values. The output is just below:

Address of {type: int}    &a    =       0031FEF4; a    = 1 Address of {type: int[2]} &b    =       0031FEE4; b    = 0031FEE4 Address of {type: int[2]} &b[0] =       0031FEE4; b[0] = 2 Address of {type: int[2]} &b[1] =       0031FEE8; b[1] = 3 Address of {type: int*}   &c    =       0031FED8; c    = 008428C8 Address of {type: int*}   &c[0] =       008428C8; c[0] = 2 Address of {type: int*}   &c[2] =       008428D0; c[2] = 1 

Once I made sure I knew what was where I tried a few things. The first idea that came to mind was to get the address of the second element to the pointer's allocation, then replace the array's memory address with it (see the code just below). Everything I did try ultimately failed, usually with syntax errors.

This is what I tried. I really want this to work, since it would be the simplest solution.

b = &c[1]; 

This did not work obviously.

Edit: Solution: Don't do it! If it's necessary create a pointer to an array and then point to the array; this is pointless for any purposes I can fathom. For more detailed information see the answer by rodrigo below.

like image 748
Josh C Avatar asked Nov 18 '13 11:11

Josh C


People also ask

How do I cast a pointer to int?

An object pointer (including void* ) or function pointer can be converted to an integer type using reinterpret_cast . This will only compile if the destination type is long enough. The result is implementation-defined and typically yields the numeric address of the byte in memory that the pointer pointers to.

How do you change a pointer to an array?

p = arr; // Points to the whole array arr. p: is pointer to 0th element of the array arr, while ptr is a pointer that points to the whole array arr. The base type of p is int while base type of ptr is 'an array of 5 integers'.

What happens when you cast a pointer to an int?

Any pointer type may be converted to an integer type. Except as previously specified, the result is implementation-defined. If the result cannot be represented in the integer type, the behavior is undefined. The result need not be in the range of values of any integer type.

What is casting a pointer?

In the C language, casting is a construct to view a data object temporarily as another data type. When you cast pointers, especially for non-data object pointers, consider the following characteristics and constraints: You can cast a pointer to another pointer of the same IBM® i pointer type.


1 Answers

First of all b is an array, not a pointer, so it is not assignable.

Also, you cannot cast anything to an array type. You can, however, cast to pointer-to-array. Note that in C and C++ pointer-to-arrays are rather uncommon. It is almost always better to use plain pointers, or pointer-to-pointers and avoid pointer-to-arrays.

Anyway, what you ask can be done, more or less:

int (*c)[2] = (int(*)[2])new int[2]; 

But a typedef will make it easier:

typedef int ai[2]; ai *c = (ai*)new int[2]; 

And to be safe, the delete should be done using the original type:

delete [](int*)c; 

Which is nice if you do it just for fun. For real life, it is usually better to use std::vector.

like image 125
rodrigo Avatar answered Sep 19 '22 10:09

rodrigo