将字符串地址作为参数传递给指针到字符功能的指针

时间:2014-08-28 18:01:23

标签: c string char

在我进行在线测验(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);

它们似乎都没有真正改变传递的字符串。所以,如果我确实需要修改字符串,我该如何通过引用传递它?

感谢。

1 个答案:

答案 0 :(得分:3)

在所有情况下,您都将指针传递给C函数,修改指针而不是其内容,然后在main()中打印字符串。传递指针时会生成指针的副本,因此您在函数中修改的版本不会影响main()中的值。这就是为什么除非你开始修改指针的内容,否则你不会看到字符串的任何变化。

如果您想对字符串进行更改:

void myfunc(char** param){
        ++(*param);
}

将打印ello_World,因为它会将main()使用的地址增加到指向包含该字符串的内存。

void myfunc(char* param){
    ++(*param);
}

将打印iello_World,因为它将修改包含该字符串的实际内存中的第一个char