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

时间:2011-01-30 19:19:05

标签: c pointers

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

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

void setChar(char* charToChange)
{
    charToChange = "B";
}

6 个答案:

答案 0 :(得分:23)

你想要的是*charToChange = 'b';。指针charToChangesetChar中的局部变量(参数),但您可以使用前缀*运算符和赋值更改它指向的内容。请注意,*charToChange也是一个字符,而不是字符串。

答案 1 :(得分:11)

您必须将dereference指针传递给setChar()才能修改它指向的值,而不是指针参数本身。

您还必须使用字符文字'B'而不是字符串文字"B"(指向char的指针,而不是char)。

void setChar(char* charToChange)
{
    *charToChange = 'B';
}

答案 2 :(得分:9)

当您使用& 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'

永远记住

  

*表示ValueAt和

     

&安培;意味着地址

答案 3 :(得分:3)

您想要将指针的值更改为,而不是指针本身。

因此,您需要使用*pointer取消引用指针:

void setChar(char* charToChange) {
    *charToChange = 'B';
}

如果不这样做,只需更改charToChange的本地值。

答案 4 :(得分:2)

你需要取消引用它,文字必须是字符而不是字符串,即使用撇号而不是双引号:

void setChar(char* charToChange)
{
    *charToChange = 'B';
}

答案 5 :(得分:1)

C复制作为参数传入函数的指针。 所以在函数内部你正在操作指针的副本, 不是指针本身。当函数退出时,指针如果退出 改变了

 while (p++)  if (*p = '\0') break;  //example

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

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

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