2016-03-22 5 views
0

このコードは文字列を逆順にしています。ここでは文字列が値渡しされ、関数戻り値を任意の変数に代入していないので、元の文字列をどのように逆にしますか?なぜreverse関数がCの元の文字列値を変更するのですか?

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

void reverse(char [], int, int); 
int main() 
{ 
char str1[20]; 
int size; 

printf("Enter a string to reverse: "); 
scanf("%s", str1); 
size = strlen(str1); 
reverse(str1, 0, size - 1); 
printf("The string after reversing is: %s\n", str1); 
return 0; 
} 

void reverse(char str1[], int index, int size) 
{ 
char temp; 
temp = str1[index]; 
str1[index] = str1[size - index]; 
str1[size - index] = temp; 
if (index == size/2) 
{ 
    return; 
} 
reverse(str1, index + 1, size); 
} 
+0

結局のところ、文字列が値渡されないのでしょうか? – juanchopanza

+0

'reverse(str1、0、size - 1) 'を呼び出すと、文字列のコピーではなく元の文字列のアドレスを関数に渡しているので、関数は元の文字列を変更します。 Cでは、シンボル 'str1'は文字列/配列のアドレスを表していますので、値渡しです。アドレス*の*値を渡すだけです。これは、C構文が配列に対して機能する方法です。配列を値で直接渡すための構文はありません。 – lurker

+0

文字列がまったく渡されていません。それはCの仕組みではありません。あなたがやっていることは、文字列への参照を渡すことです(これは値渡しです)。 – Taelsin

答えて

0

一般に、文字列と配列は、Cではファーストクラスのデータ型ではありません。以下のようなあなたがCの値で文字列を渡すことができない、引数:

char str1[] 

は、例えば関数内sizeof(str1)をチェックしてみ

char* str1 

と同じです - あなたはそれが同じであることがわかります渡される文字列のサイズに関係なく、sizeof(char*)となります。またprintf("%p\n", str1);str1reverse()str1と同じメモリを参照していることがわかります(または単にデバッガで同じことを観察してください)。

実際には参照渡しであるため、呼び出し元文字列が変更されています。

関連する問題