2015-05-01 43 views
3

,如果我有使用C以下:通行證陣列的功能

void increment_ptr(int *arr_ptr) 
{ 
    int i; 
    for(i=0; i<10; i++) 
    { 
     arr_ptr++; 
    } 
} 

int main() 
{ 
    int arr[10] = {1,2,3,4,5,6,7,8,9,10}; 
    int *arr_ptr = arr; 

    increment_ptr(arr_ptr); 
} 

難道我就在想,當我打電話increment_ptr後返回main,​​仍然指向arr[0]

回答

6

因爲你調用該函數是這樣的:

increment_ptr(arr_ptr); 

這傳遞指針的副本(傳址值)。​​in increment_ptr與中的​​不同,儘管它們都指向相同的存儲位置arr&arr[0])。從函數increment_ptr修改​​將不會影響main中的​​。

對於來自increment_ptrmain修改​​,你需要傳遞的​​到increment_ptr其地址是int**(指針指向int

1

是的,這是正確的。可以這麼說,函數可以修改pointees,但不能指示指針,因爲我們將所有的東西都通過值來傳遞。如果要修改​​,則需要指針指針,如下所示:

static void set_to_null(int** arr_ptr) 
{ 
    *arr_ptr = 0; 
} 

int arr[] = {1, 2, 3, 4, 5}; 
int* arr_ptr = arr; // arr_ptr stores address of 'arr' 
set_to_null(&arr_ptr); // arr_ptr now stores 0 (null)