如何在函数中操作变量?

4th*_*ace 1 c pointers

在下面的示例中,我将char作为指针传递给函数.当函数打印出char的内存地址时,它是一个不同的地址.我在这种情况下处理两个不同的变量吗?是不是我在函数参数中没有使用指针的结果相同(与按值传递相同)?

char a = 'a';
printf("a=%p\n", &a);
showString(a);

//function 
void showString(char *c){
  c='b';
  printf("c=%p\n", &c);
}
Run Code Online (Sandbox Code Playgroud)

c被赋值为'b'.但如果我a在函数调用后检查,它仍然具有值'a'.以上内容如何更改,以便函数中分配的值在函数外部进行?

das*_*ght 6

您没有正确使用指针:不是为指针指向的对象分配新值,而是指定指针本身.

调用应使用address-of运算符,赋值应该与dereference运算符一起使用:

showString(&a);
printf("a=%p\n", (void*)&a);
...
void showString(char *c){
    *c='b';
    printf("c=%p\n", (void*)c);
}
Run Code Online (Sandbox Code Playgroud)

现在两个打印输出都会产生相同的地址,并且char a调用函数的值应该改变.

注1:编译器允许c = 'b'赋值的原因有点奇怪:'b'被认为是一个字符常量,char被认为是一个整数类型,而C允许您将整数赋给指针,假设您知道自己比编译器做得更好.

注意2:当您使用指针打印指针时%p,指针类型既不是也不void*char*,void*则需要使用强制转换.你正在打印char*,所以它可以没有演员阵容,但无论如何我都添加了演员,以防你想用不同类型的指针试试这个.

  • @chux在C99标准6.2.5第27部分中,它指出"指向void的指针应具有与指向字符类型的指针相同的表示和对齐要求." 这就是我认为编译器不抱怨的原因. (2认同)