0

アドレスで文字列を参照するために使用される文字ポインタを渡す場合 (つまり、名前または を介し​​て直接&name[0])​​、アドレスで渡すため、元の文字列を渡す必要があります。

しかし、次のコードを実行した後、最初の要素のアドレスの 2 つの異なる値を取得しました。驚くべきことに、それらは 2 バイト離れています。

また、関数内の文字列の内容を変更しても、渡された配列の内容は変更されませんでしたが、これは、新しい文字列によって新しいアドレスが生成されるためですよね?

しかし、最初の要素のアドレスが異なることについては、どのように可能ですか?

#include<conio.h>
#include<stdio.h>
#include<iostream.h>

void fn(char *arr)
{
    cout<<endl<<&arr;
    arr="hi";
}

void main()
{
    clrscr();
    char *arr="hey";
    cout<<endl<<"main "<<&arr;//the address is different from that in fn
    fn(arr);
    cout<<endl<<arr;
}
4

2 に答える 2

4

ポインターvalueで渡し、ポインターのアドレスとコピーを比較していますが、もちろん異なります。それらが同じメモリアドレスを指していることを確認したい場合は、次のようにします。

std::cout << (void*)arr << std::endl;

関数内の文字列の内容を変更しましたが、渡された配列の内容は変更しませんでした

文字列の内容を変更するのではなく、ポインターのコピーを別の文字列リテラルを指すように再割り当てします。また、ポイントされたメモリ (リテラル) を変更すると、未定義の動作になることにも注意してください。

コンパイラがコードを通過させる (つまり、コンパイルする) 唯一の理由はchar*、文字列の内容を指す をリテラル (タイプconst char[]) にすることを可能にする下位互換性機能があるためです。警告が表示されているはずであり、それを避ける必要があります。

于 2012-05-30T21:40:09.890 に答える
0

参考までに。重複としてクローズされたため、文字配列の受け渡しに関する同様の質問についてはコメントできませんでしたが、この問題はかなり重要であるため、クロスポストしてもかまわないことを願っています。

本番アプリケーションで文字列を使用する場合、多くの労力をかけずに市場を大幅に拡大できるため、通常は UTF-8 を使用します。

http://www.joelonsoftware.com/articles/Unicode.html

ほとんどのアプリケーションは、文字列クラスを使用して文字をカプセル化します。次に、次のようなものを使用できます。

void fn(..., const std::string &static_string, ...);

あなたのヘッダーに。gettext のようなライブラリを使用する場合、コードは次のようになります。

printf(gettext("そして突然、良い行が 1 行表示されます.."));

ここでは、英語の文字列がローカライズ ファイルへの直感的なインデックスとして機能し、インストール時または実行時に言語をすばやく簡単に切り替えることができます。

C を使用しているためにクラスを使用できない場合は、gettext ドキュメントでこのケースもカバーされています。

于 2014-02-27T02:42:17.277 に答える