2014-10-27 54 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