[英]Simple C++ pointer confusion
void changeStr(char *str)
{
str = "D";
}
void changeStr(char **str)
{
*str = "S";
}
char str[] = "Good";
changeStr(str);
cout<<str<<endl;
char *p = str;
//*p = 'j';
changeStr(&p);
cout<<str<<endl;
我只是嘗試更改str[]
該數組的值。 沒有退貨!
我認為第一個changeStr
只是傳入str
指針,並更改了該值,但實際上並沒有改變它。
第二個我使用指針的指針,但也無法正常工作。
讓我們逐步進行。
char str[] = "Good";
您正在創建一個字符數組,長度為5個字符,內容如下:
{ 'G', 'o', 'o', 'd', '\\0' }
changeStr(str);
在這里,您正在將該數組傳遞給函數。 由於數組會衰減為指針,因此此調用完全可以。
void changeStr(char *str)
{
str = "D";
}
現在,這是第一個問題。 您可能會混淆"D"
和'D'
。 如果要更改數組中的第一個字符,則需要采用以下方法:
str[0] = 'D';
這樣就可以了。 更改指針不會執行任何操作,因為它是一個本地變量,該指針持有指向數組開頭的指針,而不是數組本身。 如果只用{ 'D', '\\0' }
替換數組的整個內容,則需要使用strcpy
。
strcpy(str,"D");
現在,讓我們檢查最后一部分。 在這里,您將事情弄混了。
char *p = str;
changeStr(&p);
您正在創建一個指向數組開頭的新變量,並將指向該變量的指針傳遞給下一個函數。
void changeStr(char **str)
{
*str = "S";
}
這確實改變傳遞的原始變量,但請記住,這是p
不是數組。 你所做的就是改變p
指向的位置。 現在它指向常數"S"
。
在changeStr
函數的第一個版本中,參數str
被視為局部變量,並且由於對它們的所有局部變量的更改僅在實際函數內部進行了更改。
第二個版本將字符串作為參考傳遞。 基本上,這是當您指定應使用&
規范將變量作為引用傳遞時發生的情況:
void changeStr(char *&str)
在內部,編譯器將引用作為指針傳遞。
要更改str的值,您必須通過引用將其傳遞。
一定像
void changeStr(char* &str)
這將確保變量通過引用傳遞,因此,如果您對函數中的變量進行任何更改,它將是全局更改。
您不應該使用賦值運算符將字符串存儲在變量中,即使它是指針。 在包含string.h之后使用strcpy
void changeStr(char *str)
{
strcpy(str, "D");
}
這應該更改str指針指向的數據...甚至在進行函數調用的范圍內...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.