使用指针更改不同函数中的变量

时间:2014-10-27 18:19:17

标签: c arrays pointers casting void-pointers

我有一些C代码,我不允许更改结构。我的主要功能中有一个名为arr的数组:

int arr[4] = {1,2,3,4}

我必须在另一个函数中更改此数组的值。使用以下内容在main函数内部调用:

change_array(arr);

change_array方法在另一个.c文件中实现。我只允许在change_array函数中进行更改。

void change_array(void *the_array)
{

}

在这个函数中我想改变arr的值。我发现我可以使用以下方法获取数组的第一个值:

int first_value = *(int*)the_array;

我可以使用以下方法获取第一个值的位置:

int location = the_array;

我尝试用以下内容更改值:

*the_array = 1;

但这并没有解决我的问题。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可以在change_array()函数中创建一个int指针,并通过它修改值,如下所示。这是有效的,因为传递的指针只是数组中第一个元素的内存地址。因此,通过将另一个指针(适当类型)指定给同一位置,您可以直接修改原始值。也就是说,您对函数中的内存位置所做的任何更改也会更改原始数组,因为它们在内存中占据相同的位置。

正如其他人所指出的,你将无法知道他们传递给你的阵列的大小。你提到无法更改调用代码,所以我认为这不是你的选择。假设你的函数只会被调用,固定大小是脆弱的,但它仍然适合你。

#include "stdio.h"

void change_array( void * the_array );

int main()
{
int arr[ 4 ] = { 1, 2, 3, 4 };

printf( "Before:\n%d | %d | %d | %d\n", arr[ 0 ], arr[ 1 ], arr[ 2 ], arr[ 3 ] );
change_array( arr );
printf( "After:\n%d | %d | %d | %d\n", arr[ 0 ], arr[ 1 ], arr[ 2 ], arr[ 3 ] );

return( 0 );
}

void change_array( void * the_array )
{
int * arr_ptr = the_array; //NOTE: This is implicitly converting the void * to an int *
printf( "In the changing function:\n%d | %d | %d | %d\n", arr_ptr[ 0 ], arr_ptr[ 1 ], arr_ptr[ 2 ], arr_ptr[ 3 ] );
arr_ptr[ 0 ]  = 5;
arr_ptr[ 1 ]  = 6;
arr_ptr[ 2 ]  = 7;
arr_ptr[ 3 ]  = 8;
}  

您可以在此处看到它:http://codepad.org/6PXBeZlY

答案 1 :(得分:2)

在C编程语言中,数组的地址是第一个元素的地址。

  1. * the_array指向第一个元素(在您的情况下为值1)。您需要使用[]或pointer arithmetic来移动数组。

  2. 您还需要数组的大小,以便可以在不超出范围的情况下迭代数组。

  3. 以下是一个例子:

    void change_array(void *the_array, int size)
    {
       int a = 0, b = 0, i = 0;
    
       // how to set and iterate
       for(i = 0; i < size; i++)
       {
           ((int*)the_array)[i] = i;
       }
    
       // how to get
       a = ((int*)the_array)[0];
       b = ((int*)the_array)[1];
       b = *((int*)the_array + 1); // same as the line before. Example of pointer arithmetic
    }