[英]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
。
您的代碼只傳遞first
和second
訂單的副本。 要更改first
和second
,您必須傳遞引用或指針。 供參考:
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.