我有一个main
函数,它有一个char,我试图将指向该char
的指针传递给一个函数并让它从A
更改为B
但它似乎并没有改变它。这里显示的例子只是代码的当前状态,我尝试了许多不同的变体,因此可能存在其他错误,只是简单地抓住吸管。
int main()
{
char result = 'A';
setChar(&result);
printf("%C", result);
}
void setChar(char* charToChange)
{
charToChange = "B";
}
答案 0 :(得分:23)
你想要的是*charToChange = 'b';
。指针charToChange
是setChar
中的局部变量(参数),但您可以使用前缀*
运算符和赋值更改它指向的内容。请注意,*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) 这通常发生在传递给定义的函数的变量中 通过引用或跨执行上下文(如进程之间的线程或共享内存)获取值的单独模块。