指针作为函数参数

时间:2013-12-29 16:25:30

标签: c++ function pointers

我的代码如下:

#include <iostream>
#include <vector>
#include <string>
using namespace std;
void foo(int *a,int c){
    a=&c;
    cout<<"2-a:"<<*a<<endl;

}

int main()
{
    int *  a;
    int b=3;
    int c=6;
    a=&b;
    cout<<"1-a:"<<*a<<endl;
    foo(a,c);
    cout<<"3-a:"<<*a<<endl;
    return 0;
}

它给了我

1-a:3
2-a:6
3-a:3

有没有办法写?

1-a:3
2-a:6
3-a:6 

6 个答案:

答案 0 :(得分:4)

您将指针作为值传入,即指针被复制。如果你想能够修改指针本身而不是指针对象,你需要传入一个引用:

void foo(int*& a,int& c){
    a=&c;
    std::cout << "2-a:" << *a << '\n';
}

请注意,c也通过引用传递:否则a将被设置为指向即将超出范围的临时变量。以后对a的任何访问都将是未定义的行为。由于amain()之前声明c,因此仍然存在触发未定义行为的危险(如果在a超出范围后访问c;但是,在您的代码中并非如此,但可能会导致悲伤。

答案 1 :(得分:1)

您需要将ac变量作为地址或对它们的引用传递。例如:

void foo(int **a,int &c){
    *a=&c;
    cout<<"2-a:"<<**a<<endl;

}

foo(&a, c);

传递c作为参考也是必要的,因为它的地址即使在函数之外也必须有效。如果您将其声明为void foo(int **a, int c),则c变量仅在函数体中有效,然后a将指向无效的内存。

查看this SO问题的答案

答案 2 :(得分:0)

您永远不应更改参数 - 它们代表输入到函数。正确的方法是返回输出值:

int foo(int c) {
    cout << "2-a:" << c << endl;
    return c;
}

这有几个原因,其中包括使接口统一并限制不可预测的副作用(这反过来使函数更易于推理,从而减少了错误)。

除此之外,Dietmar的答案显示了如何修改参数。但是,再一次:解决这个问题的正确方法是通过修改参数来返回值 not

答案 3 :(得分:0)

foo功能说明

foo函数采用指向整数值和整数值的指针。这些变量存储在堆栈中。

void foo(int *a, int c) {

以下语句表示:a现在应指向变量c的地址。这不会改变原始的尖头值。

    a=&c;

因此,*ac现在共享相同的值,因为a指向c

    cout<<"2-a:"<<*a<<endl;

因此,foo需要2个参数并始终打印第二个参数。

}

修改功能:

您确实希望foo函数将c的内容放入a指向的单元格中。所以你应该写:

void foo(int *a, int c) {
    *a = c;
    cout<<"2-a:"<<*a<<endl;
}

<强>测试

 % g++ code.cpp
 % ./a.out 
1-a:3
2-a:6
3-a:6

答案 4 :(得分:-1)

将功能更改为如下。

void foo(int *a,int * c){
    a=c;
    cout<<"2-a:"<<*a<<endl;
}

并使用foo(a,&c);

进行调用

答案 5 :(得分:-1)

你可以尝试

void foo(int **a,int c){
    (**a)=c;
    cout<<"2-a:"<<**a<<endl;

}