質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.23%

ポインタ アドレスの使い方

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,350
退会済みユーザー

退会済みユーザー

初歩的な質問だと思いますがご教授ください。

char*にstring型のアドレスを代入するにはどうすればよいのでしょうか。
例えば、string型の変数strに"Hello"という文字列を格納します。
このstrのアドレスをchar*の変数p_strに格納したいです。

 private void button1_Click(object sender, EventArgs e)
        {
            string str = "Hello";
            fixed(char* p_str = str)
            {
                textBox1.Text = Convert.ToString(*p_str);
            }            
        }


アドレスのときは変数の前に&を付けると思いますが、「マネージ型('string')のアドレスの取得、サイズの取得、またはそのマネージ型へのポインターの宣言が実行できません」と出てきてfixedの構文??を使用しています。上記で実行すると「H」だけが返って来ます。
「Hello」が返って来るにはどのようにすればよいのでしょうか?

また、int型で試してみると疑問点が見つかったのでこちらもお願いいたします。

 private void button1_Click(object sender, EventArgs e)
        {
            int a = 65535;
            char* p = (char*)&a;

            textBox1.Text = Convert.ToInt32(*p).ToString();          
        }


こちらはint aに65535という値を格納しています。この数値以下ならtextBoxに65535と値が入りますが、+1の65536をaに格納すると0が返ってきます。+2の65537をaに格納すると1が返って来ます。
原因はなんでしょうか。

よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

[Char*]についての質問への回答

char* p_str = str


この部分を丁寧に読み解いていきましょう。

1)strはString型(最後がnull文字("\0")で終わるcharの配列)ですから、strはString型のアドレスを表します。
p_str = str と代入することで、p_strにString型の変数strのアドレスを代入できています。

2) char* p_str と宣言されているので、p_strはchar型へのポインターです。
それが指し示す *p_strは、char型(一つの文字)になります。

Convert.ToString(*p_str) で、"H"だけが返ってくるのは、*p_strが"H"だからです。(*p_strが1つの文字なのですから、当然です)

3) p_strを使って、HelloというStringを得るには、p_strを代入したString型の変数を使います。以下のような感じ。

   string str2 = p_str;
   printf("Stringを表示する。 %s",str2);   

C,C#など型を持つプログラム言語では、同じアドレスを持つ変数であっても、変数が定義されている型によって変数の値が異なります("Hello"のアドレスを持っていても、char型なら"H"、String型なら"Hello"になる)ので、注意深くコードを書いてください。

別の型の変数に代入する(Castする)際には、それが何を意味しているのかを良く考えてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/02 13:25

    ご回答ありがとうございます。つまりchar*に"Hello"という文字列のアドレスは格納できないということでしょうか。知識不足ですみません。

    キャンセル

  • 2017/11/02 13:54

    回答した通り、char*型の変数p_strに"Hello"という文字列のアドレスは格納できています。 それは、*p_strの値が"Hello"の最初の文字"H"である事で確認できます。 同じアドレスを指していても、String型の変数の場合はString(文字列)、Char型の変数の値はChar(1つの文字)が値となるというように変数の型によって値が異なるという事をご理解ください。

    キャンセル

  • 2017/11/02 17:24

    理解できました!ありがとうございます。ただ、string str2 = p_strをすると「char*をstringに暗黙的に変換できません」と出てきます。なので、string str2 = Convert.ToString(p_str)にすると「char*からobjectへ変換することはできません」と出てきます。
    どのようにキャストしてやればよいのでしょうか?
    よろしくお願いいたします。

    キャンセル

checkベストアンサー

0

string str = p_str;
textBox1.Text = str;


で、できますかね?

理解しなければいけないのはそれぞれの型ではないでしょうか。
char*はあくまでchar型のポインタであり、string型ではありません。
textBox1.Text = Convert.ToString(*p_str);と指定すればchar型としてとれる'H'だけがTextに格納されることになるかと思います。

int型は4バイトなので65536も入るはずです。
結果が0となっているのであれば、格納されるtextBox側がサイズ的に足らないのではないでしょうか。
C#は詳しくないので事象からの予想になってしまうのですが、事象からするとushortな感じな気がします。
ushortならば範囲が「0~65535」なので65536を入れると桁あふれしてしまうのも頷けます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/02 13:25

    ご回答ありがとうございます。つまりchar*に"Hello"という文字列のアドレスは格納できないということでしょうか。知識不足ですみません。

    キャンセル

  • 2017/11/02 13:41 編集

    理解と表現としては違います。
    アドレスが格納できないのではなくて、「格納はできるけどchar *のアドレスを指定したらcharの分しか見れない。」ということです。
    stringの分を見たいなら、stringの分が見れるように指定しましょう。

    キャンセル

  • 2017/11/02 13:45

    理解しました!そういう事だったんですね。ありがとうございます。

    キャンセル

  • 2017/11/02 14:00

    よかったです^^

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る