C言語なら俺に聞け(入門篇) Part 45at TECH
C言語なら俺に聞け(入門篇) Part 45 - 暇つぶし2ch27:デフォルトの名無しさん
09/02/20 02:31:20
叩けるコードが出てきた時のこのスレの賑わいは異常

28:デフォルトの名無しさん
09/02/20 03:21:36
レベルが初歩的だとなおのこと盛況

29:デフォルトの名無しさん
09/02/20 03:24:18
叩けないコードを勘違いして叩いたあげくに逆ギレするよりよっぽどマシw

30:デフォルトの名無しさん
09/02/20 04:33:10
ここも2ちゃんだから、勘違い上級者なら叩かれても仕方ない。
しかしそのままずっと勘違いするよりはマシかもな

31:℃素人
09/02/20 09:02:10
/* プログラム① */
#include <stdio.h>

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

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

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

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

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

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

35:デフォルトの名無しさん
09/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:℃素人
09/02/20 09:50:00
>>35さん
ありがとうございます。
ちょっとこれから出かけてきますので、
また後ほど。

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

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

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

39:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/20 10:48:05
>普段、クラスはおろか構造体すら使わないので忘れてしまった。
>どうでもいいけど、構造体ってコンストラクタを持てるんだね。初めて知った。

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

41:476
09/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:デフォルトの名無しさん
09/02/20 11:48:32
試せばすぐ判るようなこと聞くなよ。
しかし仕事で構造体を使わないCプログラムを書いたこと無いんだが、
>>39はどういう分野の人なのかな。

あと476はもう結構

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

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

44:デフォルトの名無しさん
09/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
09/02/20 11:58:46
44さん
私の環境ではコンパイラできました
たぶん他のコードでエラーがおこってるのかもしれません



46:44
09/02/20 12:01:21
自己解決できました

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


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch