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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

7094閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/11/01 07:10

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

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

C#

1 private void button1_Click(object sender, EventArgs e) 2 { 3 string str = "Hello"; 4 fixed(char* p_str = str) 5 { 6 textBox1.Text = Convert.ToString(*p_str); 7 } 8 }

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

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

C#

1 private void button1_Click(object sender, EventArgs e) 2 { 3 int a = 65535; 4 char* p = (char*)&a; 5 6 textBox1.Text = Convert.ToInt32(*p).ToString(); 7 }

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

char* p_str = str

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

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

  1. char* p_str と宣言されているので、p_strはchar型へのポインターです。

 それが指し示す *p_strは、char型(一つの文字)になります。

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

  1. 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/01 07:51

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/11/02 04:25

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

2017/11/02 04:54

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

退会済みユーザー

2017/11/02 08:24

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

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/01 08:12

編集2017/11/01 08:14
yuki-saito

総合スコア928

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/11/02 04:25

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

2017/11/02 04:41 編集

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

退会済みユーザー

2017/11/02 04:45

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

2017/11/02 05:00

よかったです^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問