有什么区别
你能给我一些例子吗?
C和C++开发人员使用短语"通过引用传递",但它们似乎用于表示不同的东西.每种语言中这个模棱两可的短语究竟有什么区别?
我是C的新手,我有一个疑问.
由于C函数创建了它的参数的本地副本,我想知道为什么以下代码按预期工作:
void function(int array[]){
array[0] = 4;
array[1] = 5;
array[2] = 6;
}
int main(){
int array[] = {1,2,3};
function(array);
printf("%d %d %d",array[0],array[1],array[2]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
线路输出为4 5 6.
为什么这样做有效而以下情况不然?
void function(int integer){
integer = 2;
}
int main(){
int integer = 1;
function(integer);
printf("%d",integer);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,输出仅为1.
简短版本:为什么函数可以修改父变量的值,如果它们作为数组传递?
谢谢你们!
以下哪个示例是声明以下功能的更好方法?为什么?
void myFunction (const int &myArgument);
Run Code Online (Sandbox Code Playgroud)
要么
void myFunction (int myArgument);
Run Code Online (Sandbox Code Playgroud) 我在下面写了一个函数:
void trans(double x,double y,double theta,double m,double n)
{
m=cos(theta)*x+sin(theta)*y;
n=-sin(theta)*x+cos(theta)*y;
}
Run Code Online (Sandbox Code Playgroud)
如果我在同一个文件中调用它们
trans(center_x,center_y,angle,xc,yc);
Run Code Online (Sandbox Code Playgroud)
会的价值xc和yc改变?如果没有,我该怎么办?
可能重复:
C++中指针变量和引用变量之间的差异
当我开始使用C++时,我发现下面的操作令人困惑.我知道通过引用传递和传递值.但是最近我遇到了这样的功能让我很困惑:
Func1(int &a)
Func2(int *a)
Run Code Online (Sandbox Code Playgroud)
这两个函数都期望a的地址,但是当我调用Func1时,我会这样做,Func1(a)而在Func2的情况下,我调用了Func2(&a)
为什么Func1在期望a的地址时直接接受int a
为此道歉,我是一名学生正在努力学习C++,我只是觉得如果我问这个问题并且对此有很多正确的看法会更好,所以我很抱歉提出愚蠢的问题.我只是觉得问题比不知道更好.
我分别理解地址运算符&和const关键字的含义.但是,当我在阅读某个地方的示例代码时,我看到const&使用了,只是想要暗示的是什么?
它用于代替函数原型中的参数,例如:
void function (type_Name const&);
Run Code Online (Sandbox Code Playgroud)
如果只使用其中一个我会理解,但我在这里有点困惑所以一些专业的见解会很棒.
我在C++程序中有一个枚举参数,我需要使用一个通过参数返回值的函数来获取该参数.我首先将其声明为int,但在代码审查时要求将其键入为枚举(ControlSource).我做了这个,但它打破了Get()函数 - 我注意到一个C样式转换为int并解决了问题,但是当我第一次尝试使用static_cast <>修复它时,它没有编译.
为什么会这样,为什么当eTimeSource是一个int时,根本不需要转换来通过引用传递整数?
//GetCuePropertyValue signature is (int cueId, int propertyId, int& value);
ControlSource eTimeSource = ControlSource::NoSource;
pPlayback->GetCuePropertyValue(programmerIds.cueId, DEF_PLAYBACKCUEPROPERTY_DELAY_SOURCE, static_cast<int&>(eTimeSource)); //This doesn't work.
pPlayback->GetCuePropertyValue(programmerIds.cueId, DEF_PLAYBACKCUEPROPERTY_DELAY_SOURCE, (int&)(eTimeSource)); //This does work.
int nTimeSource = 0;
pPlayback->GetCuePropertyValue(blah, blah, nTimeSource); //Works, but no (int&) needed... why?
Run Code Online (Sandbox Code Playgroud) 可能重复:
通过引用传递或通过值传递?
在C++中通过引用/值传递
我遇到了pass-by-value-result方法的问题.我理解通过引用传递和传递值,但我不太清楚传值值的结果.通过值有多相似(假设它是相似的)?
这是代码
#include <iostream>
#include <string.h>
using namespace std;
void swap(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int value = 2;
int list[5] = {1, 3, 5, 7, 9};
swap(value, list[0]);
cout << value << " " << list[0] << endl;
swap(list[0], list[1]);
cout << list[0] << " " << list[1] << endl;
swap(value, list[value]);
cout << value << " " << list[value] << …Run Code Online (Sandbox Code Playgroud) 将变量传递给函数时,为什么函数只获取变量的副本/副本?
int n=1;
void foo(int i)
{
i++;
}
Run Code Online (Sandbox Code Playgroud)
众所周知,函数foo()不能通过n使用foo(n)来改变它的值.
当然我们可以传递变量的地址来对参数变量进行一些更改.
但是你不觉得这有点不方便吗?
为什么c/c ++只是为了给函数提供重复而不是直接将"真实"变量本身赋给函数?
这种范式的优点/好处是什么?
更新:
我已经阅读了@ paxdiablo的回答.我认为他的"封装,模块化和效果本地化"的解释是好的.
但在我的方式,它也可以保留参数参数的值.它还可以实现封装.通过这种方式:(假设函数可以直接获取"真实"变量而不是默认的重复)
void foo(int n)
{
int temp=n;
//Do something to temp...
}
Run Code Online (Sandbox Code Playgroud)
在我的方式中,当你想要改变传入的参数值时,可以消除复杂的机制,例如"通过引用传递"或指针.这就是好处.
经过一段时间的思考.我意识到为什么c/c ++没有像我提出的那样设计的原因只是因为我的方式的不合理!
按照我的方式,如果一个函数有很长的变量列表,那就太可怕了.我想要的是更方便的方式实际上不方便:
你必须这样写:
void foo(int a,int b,double c,float d,char s...)
{
int temp1=a;
int temp2=b;
double temp3=c;
float temp4=d;
char temp5=s;
...
//Do something to temp{1,2,3,4,5....}
}
Run Code Online (Sandbox Code Playgroud)
因此,c/c ++的设计者引入了复杂的机制来方便地进行权衡.
我对吗?
c++ ×8
c ×3
arrays ×1
const ×1
function ×1
operators ×1
reference ×1
static-cast ×1
terminology ×1
windows ×1