我的代码如下:
#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
答案 0 :(得分:4)
您将指针作为值传入,即指针被复制。如果你想能够修改指针本身而不是指针对象,你需要传入一个引用:
void foo(int*& a,int& c){
a=&c;
std::cout << "2-a:" << *a << '\n';
}
请注意,c
也通过引用传递:否则a
将被设置为指向即将超出范围的临时变量。以后对a
的任何访问都将是未定义的行为。由于a
在main()
之前声明c
,因此仍然存在触发未定义行为的危险(如果在a
超出范围后访问c
;但是,在您的代码中并非如此,但可能会导致悲伤。
答案 1 :(得分:1)
您需要将a
和c
变量作为地址或对它们的引用传递。例如:
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;
因此,*a
和c
现在共享相同的值,因为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;
}