int main()
{
void fun(char *);
char str[] = "some text";
fun(str);
return 0;
}
void fun(char* ps){
while(*ps){
cout << *ps ;}
cout << endl;
}
因此,這是 Robert Lafore 撰寫的 c 教科書中的示例之一,它說明了在函式中傳遞字串的示例。在解釋示例時,提到將陣列地址 str 傳遞給函式。這個地址是不變的,但是因為這里是按值傳遞的。并且它的副本在 fun() 中創建。
我無法理解這個陳述句,因為它是 c 風格的字串,它是一個行為類似于陣列的常量指標。名稱本身應該是地址,我們將地址傳遞給函式。我的問題是:如果名稱本身是地址,它是如何通過值傳遞的?為什么當我們將指標引數傳遞給 fun() 時會創建副本?
我在這里真的很困惑。即使在我的基礎上,我也可能是錯的,所以在這里解釋一下會很好。
uj5u.com熱心網友回復:
您可能知道,函式的每個引數(變數)都存盤在堆疊(專用于區域變數的特殊記憶體)中的某個位置并充當新變數。
所以你的功能:
void fun(char* ps)
{
...
}
具有型別為 'pointer to char' 的變數 'ps',它存在于 'fun' 函式的范圍內,沒有其他地方存在。
因此,當您從其他函式(例如您的 main)中使用它時,您將有兩個變數包含指向“某些文本”字串的指標。即 main 中的 'str' 和 'fun' 函式中的 'ps'。“ps”是書中提到的那個副本。
您還必須區分術語“地址”和“變數”。地址是存盤的內容,變數是存盤的位置。
例如,這段代碼:
char my_character = 'x';
char *a = &my_character;
char *b = &my_character;
char *c = &my_character;
是三個不同的變數(一個具有 char* 型別的變數),但它們都包含相同的值 - my_character 變數的地址。
uj5u.com熱心網友回復:
讓我們看一下程式中每個陳述句中發生的情況。
宣告 1
這里我們考慮陳述句void fun(char *);。
該陳述句是一個名為函式的宣告fun,該函式具有一個型別引數char*和一個回傳型別void。這意味著該函式將指向 char ( char*) 的指標作為值的引數并回傳 nothing( void)。
宣告 2
這里我們考慮陳述句 char str[] = "some text";
該陳述句定義char了一個名為的陣列str。也就是說,型別str是char [10]。
宣告 3
這里我們考慮陳述句 fun(str);
該陳述句呼叫fun作為引數傳遞的函式str。這里有兩件重要的事情需要注意:
由于引數是按值傳遞的,因此由于型別衰減而
str衰減到指向的指標char。這意味著,衰減到。從陳述句 1 中記住,該函式需要 a作為引數,這正是我們提供/提供它的內容。特別是,我們為它提供了一個指向陣列第一個字符的指標,它只不過是.char [10]char *funchar*char*按值表示引數被復制。但請注意,在我們的例子中,引數只不過是 a
char*(由于衰減,從上面的第 1 點開始)。這就是為什么它寫成:
但因為它在這里是按值傳遞的。并且它的副本在 fun() 中創建。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/410870.html
標籤:
