簡體   English   中英

讓函數更改指針在 C 中表示的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM