簡體   English   中英

將指針作為函數參數傳遞

[英]Passing pointers as function arguments

我有

const char* one = "q";
const char* two = "p";

如果我添加代碼

const char* temp = two;
two = one;
one = temp;

我可以切換'one'和'two'的內容,但是

void order(const char* first, const char* second)
    {
    const char* temp = second;
    second = first;
    first =  temp; 
    }

order(one, two);

我無法切換它們。 我猜這是因為我將錯誤的參數傳遞給我的函數?

編輯:true - 這些是指向const char的指針...所以指針本身不是const。

您正在嘗試更改指針指向的內容 - 該函數獲取原始指針的副本的副本,因此您需要具有指針指針或使用引用。

即:

C

void order( const char **first, const char **second )
{
  const char* temp = *first;
  *first = *second;
  *second = temp;
}

C ++

void order( const char *&first, const char *&second)
{}

(內容與您的功能相同)

簡單的解決方案是

#include <algorithm>

然后簡單地std::swap兩個指針,即std::swap(first, second)

稍微更難的解決方案是編寫自己的swap ,並調用它的order

void order(const char*& first, const char*& second) {
  const char* temp = second;
  second = first;
  first =  temp; 
}

注意在參數中使用& 這意味着參數通過引用傳遞,這意味着對指針的修改將反映在對傳入參數的修改中。

引用是一種C ++特性,它允許您將變量作為其他變量的別名。

你的問題是你混淆了領域的地圖(指針)(指向的數據),然后認為指針上的=修改了數據。 相反,你制作了地圖(指針)的副本,在你的函數中繪制了它們,然后丟棄你離開子程序后制作的副本。

因為所有的更改(交換)都在指針的副本(重復的地圖)上,原始指針(地圖)就在那里。

我使用“map”和“territory”作為對Alfred Korzybski的引用,這些單詞都沒有在編程上下文中使用,或者指的是C ++中通常稱為map

您的代碼只傳遞firstsecond訂單的副本。 要更改firstsecond ,您必須傳遞引用或指針。 供參考:

void order(const char *&first, const char *&second)
{
    const char *temp = second;
    second = first;
    first =  temp; 
}

對於指針:

void order(const char **first, const char **second)
{
    const char *temp = *second;
    *second = *first;
    *first =  temp; 
}

還有std::swap ,包括<algorithm>

std::swap(first, second);

另外,如果字符串是常規數組而不是字符串文字,你可以將它們作為char *而不是const char *傳遞並交換數組的內容而不是交換指向它們的指針,前提是每個數組都足夠大以包含字符串另一個。

您按值傳遞指針並期望在該函數內更改這些指針的值。 類似於按值傳遞任何變量。 如他人所指出的,通過引用傳遞它們。

您的函數獲取指針的本地副本。 本地副本實際上已切換,但未在調用函數中反映,因為它們的作用域在order()函數內結束。

您可以使用strcpy()函數將字符串復制到臨時char數組,然后交換它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM