[英]Problem with passing pointers as argument in user defined function in c++
我一直在尝试理解将指针作为参数传递的方式。 我在课程书中看到,默认情况下将指针和数组作为引用传递,但是以下程序给了我意外的结果。
我期望:
Second&First
Second*First
但是输出是:
Second&First
First*Second
我的概念是错误的还是该程序中有任何特殊的技巧? 请清除指针的概念。
void Alter(char* X, char* Y){
char* T;
cout<<"&S1="<<&X<<"&S2="<<&Y<<endl;
T=X;
X=Y;
Y=T;
cout<<X<<"&"<<Y<<endl;}
void main(){
char X[]="First", Y[]="Second";
cout<<"&x="<<&X<<"&y="<<&Y<<endl;
Alter(X,Y);
cout<<"&x="<<&X<<"&y="<<&Y<<endl;
cout<<X<<"*"<<Y;getch();}
输出正确。 您的期望与实际行为有所不同。
每当涉及到指针时,始终将它们视为包含某些内存地址的变量。
逐步查看正在发生的事情。
1) char X[]="First", Y[]="Second";
----------------
| F | <--- X
----------------
...
----------------
| S | <--- Y
----------------
2) cout<<"&x="<<&X<<"&y="<<&Y<<endl;
指针X
和Y
地址输出到屏幕上。
3) Alter(X,Y);
执行此函数调用时,将指针X和Y复制到Alter
函数的参数,例如X'和Y'
----------------
| F | <--- X, X'
----------------
...
----------------
| S | <--- Y, Y'
----------------
4) T=X; X=Y; Y=T;
T=X; X=Y; Y=T;
执行此代码后,将交换X'和Y'指针。
----------------
| F | <--- X, Y'
----------------
...
----------------
| S | <--- Y, X'
----------------
5) cout<<X<<"&"<<Y<<endl;
如您在步骤4中所见,由于X指向包含'S'的存储位置,因此'Second'首先打印,而'First'随后打印。
6) cout<<"&x="<<&X<<"&y="<<&Y<<endl;
在执行该指令之前, Alter
函数的参数已超出范围。
因此,现在的场景是这样的:
----------------
| F | <--- X
----------------
...
----------------
| S | <--- Y
----------------
7) cout<<X<<"*"<<Y;
如您在步骤6中所见,由于X指向包含'F'的存储位置,因此'First'首先被打印,而'Second'随后被打印。
是的,您的想法是完全错误的。
在您的Alter()
函数中,我在这里对其进行了简化(以删除与您的问题无关的无关输出)
void Alter(char* X, char* Y)
{
char* T;
T = X;
X = Y;
Y = T;
cout<<X<<"&"<<Y<<endl;
}
X
和Y
都是指针,它们按值传递。 因此,调用者(即main()
看不到分配X = Y
和Y = T
。 具体来说,函数( X = Y
和Y = T
)中的赋值对main()
无效。
但是, X
和Y
都指向(或可以用来引用)某物-在您的代码中,即main()
数组的第一个字符。 函数中的那些是*X
和*Y
一种过时的描述-似乎就是您的课程书所使用的-是它们是“通过引用传递”的东西。
如果我们要更改Alter()
来对*X
和*Y
进行赋值;
void Alter(char* X, char* Y)
{
char T; // note the missing * here relative to your code
T = *X; // note the added * in this line
*X = *Y; // note the added *s in this line and the next
*Y = *T;
cout<<X<<"&"<<Y<<endl; // this statement is unchanged
}
在这种情况下,输出将是
Sirst&Fecond
Sirst&Fecond
(即,交换了数组的第一个字符,并且该效果对main()
可见)。
我们也可以将Alter()
更改为
void Alter(char*& X, char*& Y) // note the ampersands here
{
char* T;
T = X;
X = Y;
Y = T;
cout<<X<<"&"<<Y<<endl;
}
在C ++中,“&”号表示X
和Y
是对指针的引用。 因此,此函数中的分配将对调用者可见。
但是,您的示例main()
(我再次只是为了删除无关的输出)将无法使用此函数进行编译
int main() // main() returns int in standard C++, not void
{
char X[]="First", Y[]="Second";
Alter(X,Y);
cout<<X<<"*"<<Y;
}
这不会编译,因为main()
中的X
和Y
是数组,并且数组都不是指针-因此无法将它们传递给希望传递给指针引用的函数。 这意味着您的函数Alter()
无法用于交换main()
的数组。
指针就像您传递给函数的任何其他整数一样,除了该整数对于编译器具有含义-它是内存中的已定义位置。
因此,指针本身是通过值传递的。 他们指向的内容据说是通过引用传递的。
当您修改传递给函数的指针变量时,调用函数中指针的实际值保持不变。 但是,当您修改指针所指向的值时,该值随处更改。
在您的示例中,X和Y是指针; 它们包含“第一”和“第二”的起始地址。 “第一”和“第二”分别是X和Y指向的数据。
考虑从您的程序派生的语句,仅使用printf
而不是cout
:
char X[] = "First";
// Prints "First"
printf("%s", X);
// Prints address of 'F' in memory
printf("%x", X);
// Prints address of X - the location where the value printed above is stored
printf("%x", &X);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.