2017-12-26 34 views
1

私はちょうどポインタを覚え始めています。なぜ私のコードが機能しないのか理解しようとしています。コンパイルエラーは表示されませんが、コードは実行したくありません。なぜ配列のアドレスを渡さないのですか?私はそうしようとした場合、私はcompiilationエラーを取得する:(文字配列を変更しない関数

まあ
#include <stdio.h> 

void switch_name(char* name) 

{ 
    name= "testv2"; 
} 

void main() 
{ 
char *name1 = "test_name"; 
printf("%s\n", name1); 
switch_name(name1); 
printf("%s\n", name1); 
} 
+0

が読ん推奨のようにC規格に従ってパラメータなし機能mainが宣言されなければならないことを考慮してください:[値渡し対参照渡しの違いは何?](HTTPS:/ /stackoverflow.com/questions/373419/whats-the-difference-between-passing-by-reference-vs-passing-by-value) –

+0

「なぜ私のコードが機能しないのですか?」 - >コードは動作します。コードは私がしたいことではありません " - >あなたは何をしたいのですか? – chux

答えて

1

Cは値渡しですので。あなたは、ローカル変数(関数swicth_name()name)に変更を加える。変更を保持するためのアドレスを渡しますchar*と(char**を逆参照することにより)直接char*に文字列リテラルのアドレスを割り当てる。例えば、これは機能swicth_namechar*のアドレスを持ってここで

#include <stdio.h> 

void switch_name(char** name) 
{ 
    *name= "testv2"; 
} 

int main(void) 
{ 
    char *name1 = "test_name"; 
    printf("%s\n", name1); 
    switch_name(&name1); 
    printf("%s\n", name1); 
    return 0; 
} 

を働くだろう。今すぐ*switch_nameに単項を使用して参照解除するときは、文字列リテラルのアドレスをname変数main()に割り当てます。それは変化が残っているのだと思う。

0

機能パラメータはローカル変数です。

あなたは元の変数name1は、関数内で変更されなかった見ることができるようにあなたは、次のよう

char *name1 = "test_name"; 
switch_name(name1); 

//... 

void switch_name(/* char* name */) 
{ 
    char *name = name1; 
    name= "testv2"; 
} 

関数呼び出しとその定義を想像することができます。関数内で変更されたのは変数nameです。

元の変数を関数で変更する場合は、元の変数を参照渡しする必要があります。

#include <stdio.h> 

void switch_name(char ** name) 
{ 
    *name= "testv2"; 
} 

int main(void) 
{ 
    char *name1 = "test_name"; 

    printf("%s\n", name1); 

    switch_name(&name1); 

    printf("%s\n", name1); 
} 

例えば

は、関数を使用して、元のポインタ自体を再割り当てしようとしている最初のプログラムでは、以下のプログラム

#include <stdio.h> 
#include <string.h> 

void switch_name(char* name) 
{ 
    strcpy(name, "testv2"); 
} 

int main(void) 
{ 
    char s[] = "test_name"; 
    char *name1 = s; 

    printf("%s\n", name1); 

    switch_name(name1); 

    printf("%s\n", name1); 

    return 0; 
} 

で上記のプログラムを比較してください。

2番目のプログラムでは、標準C関数strcpyを使用して再割り当てされるのはポインタによって指されたデータです。

int main(void) 
関連する問題