簡體   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