[英]Having a function change the value a pointer represents in C
我有一個帶有字符的main
函數,我試圖將指向該char
的指針傳遞給一個函數,並將其從A
更改為B
但它似乎並沒有改變它。 此處顯示的示例只是代碼的當前狀態,我嘗試了許多不同的變體,因此可能存在其他錯誤,因為只是抓住稻草。
int main()
{
char result = 'A';
setChar(&result);
printf("%C", result);
}
void setChar(char* charToChange)
{
charToChange = "B";
}
你想要的是*charToChange = 'b';
。 指針charToChange
是在一個局部變量(參數) setChar
,但你可以改變它指向使用前綴*
操作和分配。 請注意, *charToChange
也是一個字符,而不是字符串。
您必須取消引用傳遞給setChar()
的指針,以便修改它指向的值,而不是指針參數本身。
您還必須使用字符文字'B'
而不是字符串文字"B"
(它是指向char
的指針,而不是char
)。
void setChar(char* charToChange)
{
*charToChange = 'B';
}
當你使用&result作為參數調用setChar函數時,它會傳遞存儲它的結果的地址。
所以它被賦值給char指針* charToChange
假設結果的地址是[0x00000010] - >'A'
charToChange的地址是[0x00000100] - > 0x00000010
現在當你嘗試寫charToChange =“B”時;
它創造了新的記憶,它存儲“B”
設說[0x00001000] - >'B'&& [0x00001001] - >'\\ 0'
所以在做Assignment時它會存儲
[0x00000100] - > 0x00001000
但是地址0x00000010指向A
所以這是錯的
你應該替換charToChange =“B”; 至
* charToChange ='B';
所以0x00000100的值變為'B'
總記得
*意味着價值和
&Means Addressf
您想要更改指針指向的值,而不是指針本身。
因此,您需要使用*pointer
取消引用*pointer
:
void setChar(char* charToChange) {
*charToChange = 'B';
}
如果不這樣做,只需更改charToChange
的本地值charToChange
。
你需要取消引用它,文字必須是字符而不是字符串,即使用撇號而不是雙引號:
void setChar(char* charToChange)
{
*charToChange = 'B';
}
C復制傳遞給函數作為參數的指針。 因此,在函數內部,您正在操作指針的副本,而不是指針本身。 當函數退出時,如果指針被改變,則指針
while (p++) if (*p = '\0') break; //example
將返回其先前的值,副本將被銷毀。 指針所指向的存儲器位置的對象可以被改變,這是通過引用傳遞的整個想法。 一個常見的錯誤是嘗試將函數內部的指針置空,然后在從函數返回時發現它不為null。 在某些系統上,當您嘗試讀取或寫入變量時,會返回指向垃圾或壞內存位置的指針,從而導致程序崩潰。
void f(char* s)
{
/* code stuff */
...
s = NULL;
...
return;
}
從f現在返回s =? (之前的值,NULL或GARBAGE)這種情況最常發生在傳遞給單獨模塊中定義的函數的變量中,這些模塊通過引用或跨執行上下文(如進程之間的線程或共享內存)來獲取值。
#include <stdio.h>
void x(char* a){
*a = *"c"; // here variable a value change into "b"
}
int main()
{
char a = 'a';
x(&a);
printf("%c\n",a);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.