C语言 有没有办法不使用循环就把每个数组的元素地址复制到另一个指针数组?

4jb9z9bj  于 2023-01-16  发布在  其他
关注(0)|答案(2)|浏览(146)

我目前正在做一种'控制器'变量,可以改变原来的变量的值。

#include <stdio.h>

void changearr(int* arr[]);

int main() 
{ 
    int arr[3] = {3,4,5}; 
    int* controller[3]; 
    int idx = 0; 
    printf("Value of array is : "); 
    for (idx = 0; idx < 3; idx++) 
    { 
        printf(" %d", arr[idx]); 
        controller[idx] = &arr[idx]; 
    } 
    printf("\n");

    changearr(controller); // arr is now changed by the controller value
    
    printf("Value of array is :");
    for (idx = 0; idx < 3; idx++)
    {
        printf(" %d", arr[idx]);
    }
    printf("\n");
    return 0;

}

void changearr(int* arr[]) 
{ 
    int idx = 0; 
    for (idx = 0; idx < 3; idx++) 
    { 
        *arr[idx] += 1; 
    } 
}

代码似乎像我预期的那样工作。
然而,我不喜欢变量“controller”(指针数组)应该在for循环下初始化的部分。
有没有像“memcpy”这样的方法可以使代码更简单?

6yt4nkrj

6yt4nkrj1#

感谢评论区的所有作者& Clifford。我误解的是

  • 要使用指针更改数组'A'的元素,我需要复制属于'A'的元素的所有地址

但是希望

  • 仅复制数组“A”的起始地址,并通过访问偏移地址来改变其它元素。

所以,我需要做的就是

  • 只需将结构体的成员变量(arr 1 [3],arr 2 [4])从指针数组更改为单指针!

所以理想的代码如下所示:

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;
}
9vw9lbht

9vw9lbht2#

正如您在注解中所指出的,controller没有任何真实的用途,因为您可以传递arr,并更简单地在当前*arr[idx]所在的位置索引arr[idx]。这似乎是一个不必要的间接级别。不存在 * 运行时 * 非迭代解决方案来生成指向数组元素的指针数组(即使这有任何意义)。当然,你可以静态地初始化数组:

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

但是,只有当controller的元素在运行时被更改(例如通过排序)时,这才有用。

相关问题