[表示 : 全て 最新50 1-99 2chのread.cgiへ]
Update time : 05/09 16:08 / Filesize : 12 KB / Number-of Response : 48
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 45



1 名前:デフォルトの名無しさん [2009/02/19(木) 20:47:45 BE:302948148-PLT(56870)]
C言語の入門者向け解説スレッドです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
 C/C++の宿題片付けます 122代目
 pc11.2ch.net/test/read.cgi/tech/1232029287/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 44
pc11.2ch.net/test/read.cgi/tech/1233962622/
過去スレ
makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

31 名前:℃素人 [2009/02/20(金) 09:02:10 ]
/* プログラム@ */
#include <stdio.h>

int main( void )
{
int *x,*y;
printf("%d\n",(&y-&x)); /* ここでの表示結果は"1" */
return 0;
}
//------------------------------------------------------
/* プログラムA */
#include <stdio.h>

int main( void )
{
int *x,*y;
printf("%d\n",sizeof(&y-&x)); /* ここでの表示結果は"4" */
return 0;
}
//-------------------------------------------------------
プログラムAではsizeof演算子を付けて
望んでいた結果の"4"が出力されます。
何故、プログラム@では"1"が出力されるのでしょうか?

コンパイラは「Microsoft(R)32-bit C/C++ Standard Compiler」です。

32 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 09:07:33 ]
1はアドレス同士の計算結果を表示してるのに対して、
2はアドレス同士の計算で返った結果のサイズ(アドレスのサイズ)を表示してるから。

33 名前:℃素人 [2009/02/20(金) 09:29:37 ]
早速のレスありがとうございます。
しかし、@のプログラムでも"ポインタ"のアドレスの計算を
しているワケですので、私の32bit環境ではポインタとして
4byteをメモリに占めているので"4"が返ってきても良いとは
思うのですが・・・すみません。

34 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 09:31:17 ]
>>31
その結果が正しいとして...
MSC++では、アドレスは4バイト単位みたいな感じ
ポインタは32ビットで表記するのにね。

35 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 09:35:59 ]
>>33
ポインタ同士の引き算は、実際のアドレス値ではなくポイント対象の距離になる。
例えばこれらはどれも1。

int foo[2]; printf("%d\n", & foo[1] - & foo[0]);
char foo[2]; printf("%d\n", & foo[1] - & foo[0]);
double foo[2]; printf("%d\n", & foo[1] - & foo[0]);

しかし、配列やヒープのように連続していることが保証されている場合以外に
ポインタ同士の引き算を行なっても結果は保証されない。
つまり、>32の(1)は何が起きても不思議ではない危険なコードと言うことになる。

しかし、>32の(2)は演算結果の型のサイズを取得しているだけなので話は別。
>32の2行目の表現は、「アドレスのサイズ」ではなく「ポインタのサイズ」とするべき。

36 名前:℃素人 [2009/02/20(金) 09:50:00 ]
>>35さん
ありがとうございます。
ちょっとこれから出かけてきますので、
また後ほど。

37 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 09:51:34 ]
((char*)&foo[1]-(char *)&foo[0])/sizeof(type)
といつでも解釈して貰えると思ったらそれは違うだろ

38 名前:やれやれだぜ mailto:sage [2009/02/20(金) 09:56:26 ]
>>37
& foo[1] - & foo[0]
を等価の式に変換してごらん。

pointer[integer]は*(pointer + integer)と相互に置き換えが可能だから、
& pointer[integer]は&*(pointer + integer)になる。後は判るだろ。

39 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 10:45:50 ]
久しぶりにプログラムを書いてみようとしたら、構造体やらポインタでつまずいた。

typedef struct Tag{
int member;
char text[1024];
}KOUZOUTAI;
メンバ変数のサイズの取得の仕方がわからん。

KOUZOUTAI Obj,*pObj;
pObj = &Obj
int size = sizeof(pObj->text);
でいいの? (size == 1024 になって欲しい)

あと、メンバ変数のアドレスを調べたい
memberのアドレスを調べるには、多分、&(pObj->member)でいいと思うけど、textの方は?
&(pObj->text[0])とかでいいの? それとも、pObj->text のようにするの?

普段、クラスはおろか構造体すら使わないので忘れてしまった。
どうでもいいけど、構造体ってコンストラクタを持てるんだね。初めて知った。



40 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 10:48:05 ]
>普段、クラスはおろか構造体すら使わないので忘れてしまった。
>どうでもいいけど、構造体ってコンストラクタを持てるんだね。初めて知った。

そりゃあんた、言語が違いまんがな。

41 名前:476 [2009/02/20(金) 11:44:39 ]
ポインタの説明が回りくどいんですが

int 型の変数へのポインタ値をしまうことのできるポインタ型変数 p が宣言される

これはつまり、int ball;があったとしたら

int型の変数(ball)のメモリアドレスの値(aのアドレス)をしまうことができる ポインタ*pってことでいいんですか?

日本語力とか言いますが一般人にはわかりずらいと思います

int a;  a は intである では無く  a は int型である のほうがわかりやすいと思いますし
int *a[10]; a は、intへのポインタの配列(要素数10)である。 これだと aはint型の配列を代入できるポインタとかでいいんですか?

ごっちゃになってるので誰か詳しくまとめてくれるとありがたいです。

42 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 11:48:32 ]
試せばすぐ判るようなこと聞くなよ。
しかし仕事で構造体を使わないCプログラムを書いたこと無いんだが、
>>39はどういう分野の人なのかな。

あと476はもう結構

43 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 11:50:12 ]
>日本語力とか言いますが一般人にはわかりずらいと思います
対象は一般人じゃなくてプログラマだからそれで良いんだよ。

>これだと aはint型の配列を代入できるポインタとかでいいんですか?
よくない

44 名前:デフォルトの名無しさん [2009/02/20(金) 11:55:43 ]
char score2grade(int s)
{
if(s >= 80){
return 'A';
}else if(s >= 65){
return 'B';
}else if(s >= 50){
return 'C';
}else if(s >= 35){
return 'D';
}else{
return 'F';
}
}
最後の行がparse error at end of inputらしいんですが
どう直せばいいのでしょうか?

45 名前:476 [2009/02/20(金) 11:58:46 ]
44さん
私の環境ではコンパイラできました
たぶん他のコードでエラーがおこってるのかもしれません



46 名前:44 [2009/02/20(金) 12:01:21 ]
自己解決できました

47 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 12:16:23 ]
parse error at end of input
ホンニャクすると
こんだけのソースで仕事できっかよ!ゴラ






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<12KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef