在下面的示例中,我将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'。以上内容如何更改,以便函数中指定的值在函数外部进行?
答案 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