c++ キャスト

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
おーばー

c++ キャスト

#1

投稿記事 by おーばー » 8年前

ただいまキャスト演算子について学んでいるのですが

コード:

	#include<iostream>
	using namespace std;
	
	int main(){
		int i;
		char *p="hello world";
		
		cout<<p;
		
		i = reinterpret_cast<int>(p);
		
		cout<<i;
		
		return 0;
	}
このプログラムの i = reinterpret_cast<int>(p); という部分についてなのですが,(p)な理由がよくわからないです...
この行がcharのポインタ型であるpをint型にキャストし、のちにint型であるiへ代入するということはわかりますが(私がこう理解しているだけで、もうすでに間違えていた場合ごしてきください ><) )なぜそうするのにストレートにcharのポインタ型 *pを()内に記述,右のように記述しないのですか? i = reinterpret_cast<int>(*p);

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: c++ キャスト

#2

投稿記事 by みけCAT » 8年前

おーばー さんが書きました:この行がcharのポインタ型であるpをint型にキャストし、のちにint型であるiへ代入するということはわかりますが
正しいと思います。
強いて言うなら、p「に格納されている値を」int型に~、の方がいいでしょう。
おーばー さんが書きました:なぜそうするのにストレートにcharのポインタ型 *pを()内に記述,右のように記述しないのですか? i = reinterpret_cast<int>(*p);
これではp自体の値ではなく、pが指している場所のchar型の値がキャストされてしまいます。
どうしてこれが「ストレート」だと思うのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: c++ キャスト

#3

投稿記事 by かずま » 8年前

おーばー さんが書きました:なぜそうするのにストレートにcharのポインタ型 *pを()内に記述,右のように記述しないのですか? i = reinterpret_cast<int>(*p);
質問する前に、(p) の場合と (*p) の場合の実行結果を見て、考えたほうが良いでしょう。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: c++ キャスト

#4

投稿記事 by みけCAT » 8年前

おーばー さんが書きました:charのポインタ型 *pを
pは型ではありません。
*pはcharのポインタ型ではなく、charを指すポインタをデリファレンスして得られるchar型です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

おーばー

Re: c++ キャスト

#5

投稿記事 by おーばー » 8年前

馬鹿丸出しな返信になるかもしれませんが
キャスト対象をpにすると、アドレスがキャストされてしまっておかしなことになるのではないのですか?

私のイメージですと

コード:

#include<stdio.h>

int main(void){
    char str[]="hello world";
    char *p;
    p = str; 
    
    printf("%s",p);
    p++;
    printf("%s",p);

    return 0;
}
このプログラムのようにpはアドレスであるというイメージが強いために、なんというか
一番初めに載せたプログラムのようにアドレスを対象物として渡すのには違和感があります
勘違いがありそうなので勘違いしている部分を探したいのですが、全くわからないです。。

おーばー

Re: c++ キャスト

#6

投稿記事 by おーばー » 8年前

初めに載せたプログラムを数値同氏のやりとりに直しポインタを取り除くと

コード:

    #include<iostream>
    using namespace std;
    
    int main(){
        int i;
        float f;
        
        cout<<f;
        
        i = reinterpret_cast<int>(&float);
        
        cout<<i;
        
        return 0;
    }
と同じに感じてしまいます,というか自分の中ではほとんど同じです

おーばー

Re: c++ キャスト

#7

投稿記事 by おーばー » 8年前

一番初めに載せたプログラムのようにアドレスを対象物として渡すのには違和感があります
アドレスを()内に入れる、キャストする対象のものとして渡すには違和感が...です

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: c++ キャスト

#8

投稿記事 by みけCAT » 8年前

おーばー さんが書きました:キャスト対象をpにすると、アドレスがキャストされてしまっておかしなことになるのではないのですか?
「おかしなこと」とは何ですか?
これはそもそもアドレスをキャストするサンプルではないのですか?
このコードは書籍かwebサイトから無断転載したものではないのですか?
もしも無断転載であるとしたら、その書籍かwebサイトに解説は無かったのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: c++ キャスト

#9

投稿記事 by みけCAT » 8年前

おーばー さんが書きました:初めに載せたプログラムを数値同氏のやりとりに直しポインタを取り除くと

コード:

    #include<iostream>
    using namespace std;
    
    int main(){
        int i;
        float f;
        
        cout<<f;
        
        i = reinterpret_cast<int>(&float);
        
        cout<<i;
        
        return 0;
    }
と同じに感じてしまいます,というか自分の中ではほとんど同じです
&floatを&fにすれば、本質は同じといえるでしょう。
型「float」自体のアドレスは無いので、&floatは不正です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

おーばー

Re: c++ キャスト

#10

投稿記事 by おーばー » 8年前

アドレスをキャストするのは普通のことなのですか?

アドレスでなく変数内の数値を直接キャストすることはできないのですか?
続けて質問申し訳ないです;

おーばー

Re: c++ キャスト

#11

投稿記事 by おーばー » 8年前

無断掲載。。になりますね.
独習c++という書籍のものでキャスト演算子を学ぶにあたってサンプルコードとして掲載されていたのですが
このプログラムによって型の変換ができるとは記載されていたのですが、アドレスのキャスト等の記載はなかったです。。
また,私自身恥ずかしながらアドレスのキャスト、ということができること自体知らなかったです、、、

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: c++ キャスト

#12

投稿記事 by みけCAT » 8年前

おーばー さんが書きました:アドレスをキャストするのは普通のことなのですか?
printfでアドレスを出力する際にvoid*にキャストするのは普通ですが、整数へのキャストは普通ではないです。
普通ではないことをするので、reinterpret_castを使っているようです。
おーばー さんが書きました:アドレスでなく変数内の数値を直接キャストすることはできないのですか?
「変数内の数値」とは何ですか?
このNo: 1のコードでmain関数を抜ける直前のメモリの中身などを表した図でいうと、どれになりますか?
memory-soutei-20170327.png
メモリの図
memory-soutei-20170327.png (5.65 KiB) 閲覧数: 7227 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

おーばー

Re: c++ キャスト

#13

投稿記事 by おーばー » 8年前

返信ありがとうございます

その図で言うと,hello world\0の部分が私の言う変数内の数値、です
それをキャストによってint型へ変換する、といったものだと思っています

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: c++ キャスト

#14

投稿記事 by みけCAT » 8年前

おーばー さんが書きました:独習c++という書籍のものでキャスト演算子を学ぶにあたってサンプルコードとして掲載されていたのですが
このプログラムによって型の変換ができるとは記載されていたのですが、アドレスのキャスト等の記載はなかったです。。
独習C++ 第4版 - ハーバート・シルト - Google ブックス
なるほど、文字列は違いますがよく似たコードがあり、「pポインタを整数に変換しています。」とありますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: c++ キャスト

#15

投稿記事 by みけCAT » 8年前

おーばー さんが書きました:その図で言うと,hello world\0の部分が私の言う変数内の数値、です
*pをキャストすると'h'がキャストされ、これではhello world\0をキャストすることはできません。
まず、おーばーさんはhello world\0をintにキャストするとどのような結果になると考えているor予想しますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

おーばー

Re: c++ キャスト

#16

投稿記事 by おーばー » 8年前

私の予想は、cctypeライブラリのatoiでしたっけ?
のような感じで,頭から一つずつchar型からint型へ変換されると予想していました

返信

“C言語何でも質問掲示板” へ戻る