[英]pointers with strings in c programming
在下面的程序中,我期望printf語句能夠打印
a = b,b = a
但是,實際上是印刷
a = a,b = b
當我嘗試在函數中打印a
, b
值時,它給出a=b,b=a:::I
不明白為什么pass be reference不會影響實際參數。 我想念什么? 有人可以說明一下嗎?
void swap_pointers(char* a, char* b) {
char* tmp = a;
a = b;
b = tmp;
}
int main() {
char* a = "a";
char* b = "b";
swap_pointers(a, b);
printf("a = %s, b = %s", a, b);
return 0;
}
您僅在函數內更改函數參數的值。 如果要更改作為參數傳遞的指針存儲的地址,則需要將指針傳遞給該指針。
void swap_pointers(char** a, char** b) {
char* tmp = *a;
*a = *b;
*b = tmp;
}
然后你這樣稱呼它
int main() {
char* a = "a";
char* b = "b";
swap_pointers(&a, &b);
printf("a = %s, b = %s", a, b);
return 0;
}
什么是發生在這里,在功能你是在 B 處設置TMP的值 ,然后在 B 點的 值的值 ,該值通過使用引用操作“*” TMP的。 而當你傳遞的int參數,要傳遞的地址和b 與地址運算符“&”的地址 。 因此,您可以在函數中將(*)的值設置為(&)變量的地址。 該變量本身就是一個指針。
指針(“按引用傳遞”的“引用”)按值傳遞。 如果要更改引用,則需要通過引用傳遞引用: (char **a, char **b)
,並具有可以切換的指針到指針到字符的變量。 您的函數將用於交換這些指針的內容; 但是它本身不能交換指針。
#include <stdio.h>
void swap_pointers(char *a, char *b) {
char tmp = *a;
*a = *b;
*b = tmp;
}
int main() {
char a = 'a';
char b = 'b';
swap_pointers(&a,&b);
printf("a = %c, b = %c", a, b);
return 0;
}
嗯,這是一個非常簡單且基本的問題,與函數調用有關。
當您執行此操作swap_pointers(a, b);
,
它實際上將a
和b
的副本傳遞給該函數;
確實會在函數內部交換。
但是,然后您在函數內部不執行任何操作,控件將返回到main
。
結果, main
內部沒有進行任何更改。
這就是您所經歷的。 解決您的問題的方法是使用引用調用 。
因此,它已經由user2864740在注釋中建議,並由Dave在其答案中進行了解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.