如何在函数中操作变量?

时间:2017-05-31 15:59:21

标签: 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);
}

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

2 个答案:

答案 0 :(得分:6)

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

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

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

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

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

注2:当您使用%p打印指针时,指针类型既不是void*也不是char*,则转换为{{1} } 是必须的。你正在打印void*,所以它可以没有强制转换,但我还是添加了强制转换,以防你想用不同类型的指针试试这个。

答案 1 :(得分:3)

您的功能应该是

//function 
void showString(char *c) {
    *c = 'b';
    printf("c=%p\n", &c); //<---to print the address of C
    printf("c=%c\n", *c);  //<---to print the value that C is pointing
}

当你打电话给它时,你应该传递 a 的地址

char a = 'a';
printf("a=%p\n", &a);
showString(&a);   //<---&a and not a