2014-08-28 83 views
1

雖然我在做一個在線測驗(http://www.mycquiz.com/),我來到了這個問題:傳遞字符串地址作爲參數傳遞給指針指向CHAR函數

#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); 

他們沒有似乎真正改變傳遞的字符串。所以如果我確實需要修改字符串,我如何通過引用來傳遞它?

謝謝。

回答

3

在任何情況下,您都將指針傳遞給C函數,修改指針而不是其內容,然後在main()中打印字符串。當您傳遞一個指針時,會創建一個指針副本,因此您在函數中修改的版本不會影響main()中的值。這就是爲什麼除非你開始修改指針的內容,否則你不會在字符串中看到任何改變。

如果您想更改到字符串:

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

將打印ello_World,因爲這將增加使用main()指向包含字符串的內存地址。

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

將打印iello_World,因爲它將在實際的片的包含字符串存儲器修改第一char

+0

那麼爲什麼通過'string'或'&string'給出相同的結果呢?同時將'myfunc(char ** param)'改爲'myfunc(char * param)'具有相同的結果。這些副作用是? – 2014-08-28 18:15:33

+0

我想你的意思是第一個是'void myfunc(char ** param)'。 – 2014-08-28 18:27:57

+0

@RSahu不,我隨機更改了聲明,它得到了相同的結果。 – 2014-08-28 18:29:38