使用函数更改指针在C中表示的值

我有一个main函数有一个char,我试图将一个指向该char的指针传递给一个函数并让它从A更改为B但它似乎似乎没有改变它。 这里显示的例子只是代码的当前状态我已经尝试了很多不同的变化,因此可能存在其他错误,只是简单地抓住吸管。

 int main() { char result = 'A'; setChar(&result); printf("%C", result); } void setChar(char* charToChange) { charToChange = "B"; } 

你想要的是*charToChange = 'b'; 。 指针charToChangecharToChange中的局部变量(参数),但您可以使用前缀*运算符和赋值更改它指向的内容。 请注意, *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 

将返回其先前的值,副本将被销毁。 指针所指向的存储器位置的对象可以被改变,这是通过引用传递的整个想法。 一个常见的错误是尝试将函数内部的指针置空,然后在从函数返回时发现它不为空。 在某些系统上,当您尝试读取或写入变量时,会返回指向垃圾或坏内存位置的指针,从而导致程序崩溃。

 void f(char* s) { /* code stuff */ ... s = NULL; ... return; } 

f现在回来s =? (之前的值,NULL或GARBAGE)这种情况最常发生在传递给单独模块中定义的函数的变量中,这些模块通过引用或跨执行上下文(如进程之间的线程或共享内存)来获取值。