Home > Software engineering >  Is there any way to copy address of every array's element to another pointer array without usin
Is there any way to copy address of every array's element to another pointer array without usin

Time:01-13

I am currently making a kind of 'controller' variable that can change the original variable's value.

It's for s/w logic that works like belows:

typedef struct PropertyA
{
    int* property1;
    int* property2;
    int* arr1[3];
} PropertyA

typedef struct PropertyB
{
    int* property2;
    int* property3;
    int* arr1[3];
    int* arr2[4];
} PropertyB

int main(int* property1,int* property2,int* property3,int arr1[], int arr2[])
{
// declare
PropertyA Controller1;
PropertyB Controller2;

// Initialize
Controller1.property1 = property1;
Controller1.property2 = property2;
//Copy all element's address from main func's argument 'arr1[]'

Controller2.property2 = property2; 
Controller2.property3 = property3;
//Copy all element's address from main func's argument 'arr1[]' and 'arr2[]' to Controller2.arr1,Controller2.arr2


// Main module 
Function1(Controller1); // this function changes property1, property2, arr1
Function2(Controller2); // this function changes property2, property3, arr1, arr2


return 0;
}

the main logic is divided by two functions, and each function changes the value by referencing address that Controller1 and Controller2 contains.

However, I think pointer array such as 'Controller1.arr1' should be initialized under for loop.

Is there any way like 'memcpy' to make the code simpler?

CodePudding user response:

As you have noted in the comments, controller serves no real purpose sinve you could pass arr and more simply index that arr[idx] where you currently have *arr[idx]. It seems to be an unnecessary level of indirection. In general though, there is no runtime non-iterative solution to generate an array of pointers to elements of an array (even if that made any kind of sense). You can statically initialise the array of course:

    int arr[3] = {3,4,5}; 
    int* controller[3] = {&arr[0], &arr[1], &arr[2]} ; 

But that would only be useful if the elements of controller were to be changed at runtime, (by sorting for example).

CodePudding user response:

Thanks for all the authors on the comment sections & Clifford. What I have misunderstood is that

  • to change the element of the array 'A' using pointer, I need to copy all of the address of the elements belong to 'A'

But it is desireable to

  • copy only the start address of array 'A' and change other elements by accessing the offset address.

So, what I need to do is just

  • simply change the strucutre's member variable(arr1[3], arr2[4]) from pointer array to a single pointer!

so the desirable code is like:

typedef struct PropertyA
{
    int* property1;
    int* property2;
    int* arr1;
} PropertyA

typedef struct PropertyB
{
    int* property2;
    int* property3;
    int* arr1;
    int* arr2;
} PropertyB

int main(int* property1,int* property2,int* property3,int arr1[], int arr2[])
{
// Declare
PropertyA Controller1;
PropertyB Controller2;

// Initialize
Controller1.property1 = property1;
Controller1.property2 = property2;
Controller1.arr1 = arr1; // **and access to rest of the element by offsetting address**

// Initialize Controller2 with the same manner


Function1(Controller1); // this function changes property1, property2, arr1
Function2(Controller2); // this function changes property2, property3, arr1, arr2

return 0;
}
  • Related