2015-05-01 45 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)