繁体   English   中英

在C ++中将指针作为参数传递给用户定义函数中的问题

[英]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;

指针XY地址输出到屏幕上。

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;
}

XY都是指针,它们按值传递。 因此,调用者(即main()看不到分配X = YY = T 具体来说,函数( X = YY = T )中的赋值对main()无效。

但是, XY都指向(或可以用来引用)某物-在您的代码中,即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 ++中,“&”号表示XY是对指针的引用。 因此,此函数中的分配将对调用者可见。

但是,您的示例main() (我再次只是为了删除无关的输出)将无法使用此函数进行编译

int main()         //  main() returns int in standard C++, not void
{
    char X[]="First", Y[]="Second";

    Alter(X,Y);
    cout<<X<<"*"<<Y;
}

这不会编译,因为main()中的XY是数组,并且数组都不是指针-因此无法将它们传递给希望传递给指针引用的函数。 这意味着您的函数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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM