在我进行在线测验(http://www.mycquiz.com/)时,我提出了这个问题:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void myfunc(char** param){
++param;
}
int main(){
char* string = (char*)malloc(64);
strcpy(string, "hello_World");
myfunc(&string);
printf("%s\n", string);
// ignore memory leak for sake of quiz
return 0;
我的第一个答案选择是字符串会被修改,但是没有发生,我很困惑为什么不呢?他没有通过字面意思的地址吗? 还有一种想法告诉我,这些情况将如何变化?
void myfunc(char* param){
++param;
}
int main(){
char* string = (char*)malloc(64);
strcpy(string, "hello_World");
myfunc(string);
void myfunc(char* param){
++param;
}
int main(){
char string[12];
strcpy(string, "hello_World");
myfunc(string);
它们似乎都没有真正改变传递的字符串。所以,如果我确实需要修改字符串,我该如何通过引用传递它?
感谢。
答案 0 :(得分:3)
在所有情况下,您都将指针传递给C函数,修改指针而不是其内容,然后在main()
中打印字符串。传递指针时会生成指针的副本,因此您在函数中修改的版本不会影响main()
中的值。这就是为什么除非你开始修改指针的内容,否则你不会看到字符串的任何变化。
如果您想对字符串进行更改:
void myfunc(char** param){
++(*param);
}
将打印ello_World
,因为它会将main()
使用的地址增加到指向包含该字符串的内存。
void myfunc(char* param){
++(*param);
}
将打印iello_World
,因为它将修改包含该字符串的实际内存中的第一个char
。