2017-06-01 34 views
0

我使用这个功能遍历任何数组:如何使用指针函数写入/读取阵列

void iterate(int len, int arr[], void (*pointer) (int, int)) { 
    for (int i = 0; i < len; ++i) { 
     pointer(i, arr[i]); 
    } 
} 

但在我的内心功能:

指针(我, ARR [I]);

我无法修改arr [i]并为其指定一个新值。这是我的代码:

void iterate(int len, int arr[], void (*pointer) (int, int)) { 
    for (int i = 0; i < len; ++i) { 
     pointer(i, arr[i]); 
    } 
} 

void setCode(int index, int value) { 
    cout << "[" << index << "]: "; 
    cin >> value; 
} 

void showCode(int index, int value) { 
    cout << index << " ---- " << value << endl; 
} 

int main() { 

    int len; 
    cout << "length: "; 
    cin >> len; 

    int code[len]; 

    void (*setCodePointer) (int, int) = setCode; 
    void (*showCodePointer) (int, int) = showCode; 

    iterate(len, code, setCodePointer); 
    iterate(len, code, showCodePointer); 
} 

如果我执行并设置长度以2

位置[0]为1,[1]〜2

我得到:

0 - - 1495894288(应为1)

1 ---- 32767(应为2)

+1

您的函数指针有错误的签名。您按值传递第二个int。如果修改该值,则不会更改原始数组。 – drescherjm

+2

无论是错字还是重复[通过引用传递与按值传递有什么区别?](https://stackoverflow.com/questions/373419/whats-the-difference-between-passing-by-reference- vs-passing-by-value) – user4581301

回答

4

你的函数指针的签名

void (*pointer) (int, int) 

是它有两个整型按值,并没有返回值的函数。这意味着该函数将接收其每个参数的副本,因此当函数结束时,对变量所做的任何更改都将丢失。

相反,你需要通过参考通过第二int参数,如

void (*pointer) (int, int&) 

,改变你的setCode()showCode()功能相匹配。

+0

它现在正在工作!谢谢。 – duacos

1

int code[len];不瓦利d C++(它是有效的C99)。而你的设置函数不起作用,因为你传递了你想要设置的值,所以你读取的值被丢弃,而不是存储在数组中。