1

我可以在 C 中执行此操作:

void myFunc(int *vp) {
    // do some stuff with vp
}

int main() {

    int v[5] = {1,2,3,4,5};
    myFunc(v);

    return 0;
}

我的意思是,什么是正确的?我的函数(&v); ?

谢谢!!

4

3 回答 3

4

当您将数组作为参数传递时,数组会衰减为指针。但是,数组衰减与获取数组的地址不同。

“衰减”是某些类型在作为函数参数传递时的转换方式。即使v' 的类型是int [5]int*当你将它传递给函数时它也会变成。这是很多人不喜欢的行为,但对此无能为力。

请注意,另一方面, 的类型&vint (*)[5],即指向 5 个整数数组的指针。这种类型不会衰减,也就是说,如果您将其作为函数参数传递,它不会自动转换为另一种类型(这也是为什么在示例中使用它时它不起作用的原因,因为您需要一个指针指向整数,而不是指向整数数组的指针)。

要做的“正确”事情(假设衰减是可以的)是做myFunc(v),就像你在你的片段中做的那样。请记住,执行此操作时会丢失数组边界信息。

于 2013-09-26T04:36:51.147 回答
1

是的...您的代码是正确的。

这里v==&v[0]数组名等于数组第一个元素的地址

    myFunc(v); 

将数组名称作为参数传递,这意味着您正在传递数组中第一个元素的地址。

    void myFunc(int *vp)  

在这里,您正在使用指针。它存储传递的数组的第一个元素的地址,因此您可以访问被数组覆盖的块。通过增加指针位置。

    myFunc(&v);   

    &v==&&v[0];

&v 是数组第一个元素的地址。

现在

  void myFunc(int *vp)      

这里你得到了数组第一个元素的地址,这不是指向数组。而是指向一些内存位置。现在您无法通过增加指针来访问数组。

于 2013-09-26T04:53:14.377 回答
1

你的代码是正确的它会工作....但是你应该特别注意检查边界条件。请查看代码。

void myFunc(int *vp) {
    vp[5] = 30;
}

int main() {

    int v[5] = {1,2,3,4,5};
    int a = 10;
    printf("Value of a before fun call %d\n", a);
    myFunc(v);
    printf("Value of a before fun call %d\n", a);
    return 0;
}

相似地

void myFunc(int *vp) {
    vp[5] = 30;
    myFunc2(vp);
}

void myFunc2(int *vp) {
    vp[6] = 30;
}

int main() {

    int v[5] = {1,2,3,4,5};
    int a = 10;
    printf("Value of a before fun call %d\n", a);
    myFunc(v);
    printf("Value of a before fun call %d\n", a);
    return 0;
}

由于堆栈损坏,这将导致分段错误。由于局部变量在堆栈中。

于 2013-09-26T09:11:59.323 回答