[過去ログ] 【初心者歓迎】C/C++室 Ver.100【環境依存OK】 [無断転載禁止]©2ch.net (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
893: デフォルトの名無しさん [sage] 2017/07/10(月) 06:54:34.99 ID:t9ouoliu(1) AAS
アドレス計算自体はOKだと思うよ。
894(4): 名無しさん@そうだ選挙に行こう! Go to vote! [sage] 2017/07/10(月) 07:04:04.53 ID:Ols/UzwR(1) AAS
配列ならば確保した数+1までのアドレス計算はやっても大丈夫&整合がとれる位置に配置されている
895: 名無しさん@そうだ選挙に行こう! Go to vote! [sage] 2017/07/10(月) 07:05:58.47 ID:ZgtWUD/x(2/3) AAS
無効エリアのアドレス計算
値不定か動作不定かどっちだか忘れた
これらをOKと呼ぶならOKなんでしょう
896: 名無しさん@そうだ選挙に行こう! Go to vote! [sage] 2017/07/10(月) 07:13:12.05 ID:ZgtWUD/x(3/3) AAS
>>894
-1も有効だとうれしい事があるけど、-1はダメなんだよね
897(1): デフォルトの名無しさん [sage] 2017/07/10(月) 22:27:20.57 ID:WIOZS2V0(1) AAS
>>894
つまり式「&pp[1]」は大丈夫でないと?
898(1): デフォルトの名無しさん [sage] 2017/07/11(火) 13:12:04.11 ID:eWIFW1BW(1) AAS
ppは配列じゃないだろ
899(1): デフォルトの名無しさん [sage] 2017/07/11(火) 18:17:43.80 ID:L5b0rMHK(1) AAS
これがアスペいうやつだな
配列でないオブジェクトも要素数1の配列として考える仕様→よくご存知で
pは配列じゃないからな→わかる
ppは配列じゃないからな→頭悪いな
ppは配列じゃないだろ→アスペ
900: デフォルトの名無しさん [sage] 2017/07/11(火) 20:17:20.41 ID:gS+YojZ9(1/2) AAS
ん?まったくよくわからんのだが、だれか解説して
>配列でないオブジェクトも要素数1の配列として考える仕様
↑まずこれがよくわからない
配列じゃないオブジェクトといえば、例えばint i;などは配列としては扱えないよね
で、下二行の意味も分からない
901(1): デフォルトの名無しさん [sage] 2017/07/11(火) 22:08:22.53 ID:qjau/h5c(1/3) AAS
配列かどうかは関係なく、オブジェクトの後ろのアドレスは計算も出来るし比較も出来る
902: デフォルトの名無しさん [sage] 2017/07/11(火) 22:10:11.51 ID:qjau/h5c(2/3) AAS
>>894は配列じゃない場合に関しては何も言ってないから間違いではないが
わざわざ配列と書いてるので配列以外は違うと思ったかわからなかったか
だろう
903: デフォルトの名無しさん [sage] 2017/07/11(火) 22:14:58.67 ID:qjau/h5c(3/3) AAS
>>897
「つまり」が意味不明
>>894は配列じゃない場合には何も言ってない
「大丈夫でない」は正しい
>>898
配列じゃないから何?
>>899
実際には配列ではない
904: デフォルトの名無しさん [sage] 2017/07/11(火) 22:28:18.47 ID:gS+YojZ9(2/2) AAS
いや、それは俺も思ったんだが
ppが配列じゃないのは当たり前なんだが(てかポインタだし)
おそらくはそんなことは問うてないって言いたいんだと思う
つまり、ppが指している先が何であるかが問題であるから
配列か配列じゃないかを問うべきはppではなくppの指している先である「p」であろうと
同じことをもう一度言うけど
pp[1]としたとき問題になるのはppの指してる先がどうなっているかで
今回の場合はそれは「p」であるから
正しくは、「ppの指してる先のpは配列じゃないだろ」って言うべきっていう主張かと
905: デフォルトの名無しさん [sage] 2017/07/11(火) 23:00:18.82 ID:634mVLA8(1) AAS
>>901
なら&pp[1]も大丈夫なんじゃね?
906(1): デフォルトの名無しさん [sage] 2017/07/12(水) 07:01:19.46 ID:Mf+sZV2C(1) AAS
pp[1]の時点で動作不定
正しく動かない環境はもしかしたら存在しないかもしれないけど
907(2): ◆QZaw55cn4c [sage] 2017/07/12(水) 07:26:19.94 ID:9q9UgJkW(1) AAS
>>880880(5): デフォルトの名無しさん [] 2017/07/09(日) 16:06:32.28 ID:EeQkMvgZ(1/4) AAS
ポインタそのものにオブジェクトってできるんでしょうか?
例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、
int array[3];
int *p = array;
int **pp = &p;
for(i = 0; i < 3; i++)
{
printf("&array[%d] : %d : %d\n", i, &array[i]);
}
&array[0] : 2293472
&array[1] : 2293476
&array[2] : 2293480
&p[0] : 2293472
&p[1] : 2293476
&p[2] : 2293480
&pp[0] : 2293468
&pp[1] : 2293472
&pp[2] : 2293476
ppが参照しているpのオブジェクトの位置が、arrayのオブジェクトのアドレスと全く同じ位置にあります。
1つのアドレスが2つのオブジェクトをもてるのか、ポインタ自体にオブジェクトは生成されないのか
他の要素でそうなってるのかわかりません。どなたか回答宜しくお願いいたします。
ん、最初にもどってメッセージを書くとすれば、こうなるかな
>ポインタそのものにオブジェクトってできるんでしょうか?
私が意味を取り違えているかもしれないが、「できない」
ポインタを取得したからといって、オブジェクトが生えてくることはない
あくまで、先にオブジェクトを確保した上で、それに対してポインタを設定する手順をとる
>例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、
array を確保しているので、p は array 確保分(p 〜 p + 3)だけプログラムとして意味がある。
pp は p 一個分だけ意味がある。すなわち *pp = p、でも pp[1]= *(pp + 1) は確保していない領域を指すのでこの表現は使ってはいけない
&pp[1] と書くとなにがしかのアドレスを生成するが、それは使えない
アドレスを生成できるからといって、その領域が意味のあるものとは限らない
>>881 では意味のないことを求めてしまいごめんなさい
908: デフォルトの名無しさん [sage] 2017/07/12(水) 08:20:30.93 ID:SNfdy8To(1/3) AAS
>>906
>pp[1]の時点で動作不定
ちなみにそれを規定する規格の記述はどこ?
Cでは明確に禁止されているようだがC++では見つけられなかった
909: デフォルトの名無しさん [sage] 2017/07/12(水) 09:01:11.94 ID:6a7v2dDL(1/2) AAS
外部リンク:www.google.com
910: デフォルトの名無しさん [sage] 2017/07/12(水) 09:10:12.68 ID:6a7v2dDL(2/2) AAS
外部リンク:www.google.com
911: デフォルトの名無しさん [sage] 2017/07/12(水) 13:20:57.39 ID:ahqaJGrL(1) AAS
>>907
まとめとしてはそれでいいし否定するわけじゃないけど、若干気になるのは
1.ポインタ自身もポインタというオブジェクトじゃないのか?
2.末尾+1のアドレス(を指すポインタ)はデリファレンスできないけど、大小比較には使えるのでは
912(2): デフォルトの名無しさん [sage] 2017/07/12(水) 13:41:52.51 ID:uqOuLEsE(1/3) AAS
そんで俺はちょっと思ったんだけど
Cはポインタを配列のように扱えるのが便利だなぁと
逆に配列名を参照したらポインタ値になるし
あと他、関数ポインタを普通の関数のように扱えたり
逆に関数名を参照したらポインタ値になったり
意味の上で別解釈しようがないからそれでいいだろ、的な
二つに共通しているのは
(1)参照しても意味のある値が得られなそうなシンボルは自動的にポインタ値に成り下がってもらおう
(2)その上でポインタに対していろいろな演算 ()[] が出来るようにしておこう
というもので、これでシームレスになるしタイプも減るから便利だろう、と
でもそういう方針なんだったら何故我々は「.」と「->」を
使い分けなきゃならないんだ?と思わんこともない
意味の上で別解釈できたり不明瞭だったりは無いのに
ただ、Cの構造体は(1)を満たしていない
もし(1)を満たすようにしてしまうと、構造体を参照するとポインタ相当に成り下がってしまうので
代入演算子で代入したり、関数に値渡ししたりが出来なくなる
ただし、C言語がそのような仕様になっていた可能性は十分にあると思う
というのも配列がまさにそうであって、代入でコピーできないし、関数に値渡し出来ないから
アセンブリレベルでは配列も構造体もレジスタに入りきらないという意味では同じで
先頭アドレスからのオフセットでアクセスするのは同じであるから
そういう着想に基づけば、構造体も配列と同じようにポインタに成り下がる仕様に
なっていた可能性はあると思う
構造体は代入できないからmemcpyしろ、がCの常識だった可能性はある
そんで、「.」演算子は構造体のポインタに対して有効、となって、「->」は無くなる
で、そうはしなかった代わりに「->」演算子が有る、とも取れる
913(2): デフォルトの名無しさん [sage] 2017/07/12(水) 13:42:12.78 ID:uqOuLEsE(2/3) AAS
気まぐれか、意図的か、歴史的事情か、生い立ちに由来するものか、知らんが、そうなっている
だが実際これが大当たりで、もしそうじゃなかったらC++が全く成り立ってこない
C++のクラスはCの構造体を拡張したものだが、オブジェクトが勝手にポインタに成り下がる仕様だと
代入したり、関数のreturnで値として返したりができない
となれば独自のクラスを定義して、まるで基本型のように振舞わせたり、メソッドチェーンをしたりが出来ない
もしやるとしたらnewして返すしかないので、GCが無いとどうにもならなかっただろう
(実際C++とCの配列は相性が悪く、std::vectorかstd::arrayを使わないと上手くいかない場合も多い
ポインタ相当に勝手に成り下がってしまうので代入ができない)
ただ、このことが本当に良かった事なのかどうなのかは分からない
GCは有ったほうが良かったかもしれないし、C++の代入やコピーコンストラクタに関する話題は後を絶たない
他の言語のほとんどがオブジェクトを参照で扱うのを見てると
Cの配列のように勝手にポインタに成り下がって代入できない考え方のほうがスタンダードなのかもしれない
C++のクラスは、状況に合わせて、これを選べる、という立場になってるが
もしCの構造体が配列のような仕様だったなら、どうなっていたか分からなかった事を考えると感慨深い
914(2): デフォルトの名無しさん [sage] 2017/07/12(水) 13:43:43.81 ID:uqOuLEsE(3/3) AAS
よくよく考えてみればなかなかに奇妙
まず常人が普通に考えたら、配列や関数名を参照したらポインタ値が得られることにしようっていう発想がない
プログラマは基本的に几帳面で、整合性を気にする生き物だから
ポインタ値は「&」を付けたら得られることにしよう、と決めたのだから
&arrayとか&funcとか書かせたくなるのが普通だろう
そして(*array_ptr)[1]とか(*func_ptr)()とか書かせたくなるものだろう
ところがCは、レジスタに乗らないもの、演算できないもの、を
勝手にポインタと同等に格下げするというルールを設けたうえで
そのポインタに対して各種演算子を定義することで整合性を保ちつつタイプ数を減らすという
ウルトラCをやってのけた
ここまででも俺ではちょっと思いつかないなーと感心するわけだが
逆にこんなすごいことを思いついたんなら、全部このルールで行きたくなってくるのが凡人
その方が整合性がありそうな気がするから
なのに構造体はそうなっていなくて、代わりにアロー演算子が定義してある
だから配列と違って構造体は代入ができるし関数に値渡ししたり、値で返したりが出来る
それはそれで奇妙なことだと思ったりもするが、とにもかくにも
この辺がC++の基本方針や特色にものすごく影響が出てる
GCが無いのもそうだし、最近でも右辺値参照が追加されたりとか、結構尾を引いていて
C++特有のややこしさの一端でもあり、他には代えがたいメリットでもある
ある意味で、Cの配列の考え方のが、他言語のオブジェクトの考え方に近いというのが何とも
そして構造体をベースとするC++とCの配列は相性が悪いという
C言語の功罪は凄い
915(1): デフォルトの名無しさん [sage] 2017/07/12(水) 13:48:37.49 ID:vq82ZnF5(1) AAS
3行で(´・ω・`)
916: デフォルトの名無しさん [sage] 2017/07/12(水) 17:58:12.38 ID:SNfdy8To(2/3) AAS
駄レスの関係無いリンク先をまじまじと読んでしまった
日本語でレスが書かれていない時点で読む価値が無いと判断すべきだった
917: デフォルトの名無しさん [sage] 2017/07/12(水) 18:07:40.57 ID:SNfdy8To(3/3) AAS
>>915
「初期のK&Rが至高と考えるボクは
構造体がコピーできる仕様にハンタイです」
上下前次1-新書関写板覧索設栞歴
あと 85 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.029s