2014-10-27 26 views
3

我已经得到了一些C代码,我不能改变结构在不同的函数变化的变量。我在我的主函数中有一个名为arr的数组:使用指针

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

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

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; 

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

+0

你需要数组的大小/长度以及 – 2014-10-27 18:22:39

+2

无效不是一个类型来改变其值。您需要将the_array转换为int指针。所以,'*(int *)the_array = 1'应该可以工作。但我想知道为什么不改变'change_array(int * the_array)'。 – 2014-10-27 18:24:03

+0

将the_array复制到堆栈上的一个int * p,然后p [x] = newvalue; – user3629249 2014-10-27 21:33:12

回答

2

在C程序设计语言,该阵列的地址是所述第一元件的地址。

  1. * the_array指向第一个元素(值为1)。您需要使用[]或pointer arithmetic来移动阵列。

  2. 您还需要数组的大小,所以你可以遍历数组不用出界。

下面是一个例子:

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 
} 
+0

我得到和最后一行的错误:“无效使用空表达式” – JoeLiBuDa 2014-10-27 18:30:46

+3

您需要将其更改为'((int *)the_array)[0]' – 2014-10-27 18:31:05

+0

确实,修订@JoeLiBuDa – 2014-10-27 18:34:52

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

演员是多余的; 'int * arr_ptr = the_array;'就足够了(事实上更好)。 – 2014-10-27 18:34:57

+0

@matt我同意这是多余的,但我没有意识到使用它的任何缺点,我觉得它提供了一些更清晰的事情。 – Slater 2014-10-27 18:37:21

+1

如果稍后更改了类型,则可能会隐藏错误;总的来说,避免强制转换是很好的做法,因为它们可以抑制重要的警告 – 2014-10-27 18:54:11