トップページ⇒tech
1001コメント287KB

スレを勃てるまでもないC/C++の質問はここで 5

■ このスレッドは過去ログ倉庫に格納されています
0001 ◆h6A7qfFFu6 2008/12/29(月) 11:05:07
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
スレを勃てるまでもないC/C++の質問はここで 4
http://pc11.2ch.net/test/read.cgi/tech/1221633708/
0482デフォルトの名無しさん2009/01/03(土) 17:13:44
>>479
いや、否定してる奴が約一名いるぞ
>>442 とか>>475 とか
0483デフォルトの名無しさん2009/01/03(土) 17:15:22
>>481
失礼した。
書き方に気をつける。
0484デフォルトの名無しさん2009/01/03(土) 17:16:04
while文の条件は条件式にするってのは良い心がけだと思うよ。
linuxなんかでは値があるものは何でもってくらい条件にしちゃうので、
経験積んだらそういうソースにも慣れると良い
0485デフォルトの名無しさん2009/01/03(土) 17:33:25
条件式ではなく比較式と言ってくれ。
0486デフォルトの名無しさん2009/01/03(土) 17:42:19
>>485
呂布かいでし
0487デフォルトの名無しさん2009/01/03(土) 17:44:55
比較するとは限らんぜ
0488デフォルトの名無しさん2009/01/03(土) 19:17:03
式・・・それは愛・・・・・・
0489デフォルトの名無しさん2009/01/03(土) 19:59:08
>>485
そゆこと言ってるから、論理値をリテラルと比較する莫迦が後を絶たない。
0490デフォルトの名無しさん2009/01/03(土) 20:05:45
お前、リテラルの意味分かってないだろ
0491デフォルトの名無しさん2009/01/03(土) 20:58:12
>>489
if(hoge()!=0)...
とか?

あるいは、if((x<y)!=0)...
ということだろうか?
0492デフォルトの名無しさん2009/01/03(土) 21:00:05
(is_hoge() == true) == trueのことだろ。
0493デフォルトの名無しさん2009/01/03(土) 21:05:04
>>492
真理値型の無い言語だぞ?
巣に帰れよ。
0494デフォルトの名無しさん2009/01/03(土) 21:16:20
リテラルってほらあれだ
前屈みになって腕を横に挙げるやつ
0495デフォルトの名無しさん2009/01/03(土) 21:18:09
ボケがわかりにくい上につまんねーよw
0496デフォルトの名無しさん2009/01/03(土) 21:19:33
どどんまい?
0497デフォルトの名無しさん2009/01/03(土) 21:32:53
>>493
処理できた件数を返す関数hogeの場合、#define TRUE -1に対して、
if(hoge()){・・・}
if(hoge()==TRUE){・・・}
とか。
0498デフォルトの名無しさん2009/01/03(土) 22:01:46
>>493
お前の頭はC89止まりか。
0499デフォルトの名無しさん2009/01/03(土) 22:07:12
左辺が右辺より大きいとき
と
左辺が右辺以上の時
って何が違うんでしょうか?
>これと>=を使い分けたりすることってあるのでしょうか?
0500デフォルトの名無しさん2009/01/03(土) 22:09:23
>>499
ちゅうがっこう から やりなおせば
わかると おもいます。
0501デフォルトの名無しさん2009/01/03(土) 22:11:25
>>500
それいぜんに にぽーんごの もんだいかと
おもわれまっしゅる
0502デフォルトの名無しさん2009/01/03(土) 22:12:31
  ヾヽ\ヾ\                           ////  //
 \丶\\                               ////
                 |・\  _____ /・>      ///
     / ̄ ̄ ̄ ̄\,,   ミ\.\ヽ|||liiiii||/ /./彡   ////
 |・\ /_____/・>     /\.\|||iii||l//彡  ノ(
ミ \.\ヽ|||liiiii||/ /./ノ(   / / (,-、 ,:‐、 ) \ ⌒ヽ
   \.\|||iii||l// | ⌒  .|/ ─////─   ヽ   |
    |(,-、 ,:‐、 )   6 l   |. ////──    |  .|    \\\
.   ////Vヽ  ,-′  ////'VVVヽ     |   l
  ////ェ∧/_ /ヽ . ////  γ    l    / /
 //// |/\/ l ^ ////  i∧ェェェ∧/  / /
//// |       |//// l━━(t)━━━━┥
0503デフォルトの名無しさん2009/01/03(土) 22:28:36
>>499
左辺==右辺の時に真になるか偽になるかの違い。
必要に応じて>と>=のふさわしい方を使う。
0504デフォルトの名無しさん2009/01/03(土) 22:30:48
xが12より大きいとき
xが12以上の時

より・・以上・・そこにある違い・・それが問題ってことですよね?
0505デフォルトの名無しさん2009/01/03(土) 22:30:52
面白い釣りだなあ。
0506デフォルトの名無しさん2009/01/03(土) 22:32:36
>>503

x >= 10 == x > 10
は偽になるってことでしょうか?
0507デフォルトの名無しさん2009/01/03(土) 22:34:12
さんすうのきょうかしょをよんでね
0508デフォルトの名無しさん2009/01/03(土) 22:42:07
>>506
x==10のときだけ偽、それ以外は真。
0509デフォルトの名無しさん2009/01/03(土) 22:42:37
優先順位は大丈夫か?
0510デフォルトの名無しさん2009/01/03(土) 22:44:32
>>509
優先順位知らないんなら口出すなw
0511デフォルトの名無しさん2009/01/03(土) 22:47:21
申し訳ございません
0512デフォルトの名無しさん2009/01/03(土) 22:59:32
>>508
そ・・そうか!!
やっと理解できました!!!!

x < 10は10もは含まれないってことですよね!?
だから
int a;
cin>>a;
if("x < 10"){
cout<<”真"<<endl;
はxが10より小さいってことで
つまり10と入力しても偽になるわけだ!!!!!!!!!
0513デフォルトの名無しさん2009/01/03(土) 23:16:33
while ("テュルー")

はどうなりますか?
0514デフォルトの名無しさん2009/01/03(土) 23:17:47
無限ループ
0515デフォルトの名無しさん2009/01/03(土) 23:17:50
突っ込みどころ満載w
0516デフォルトの名無しさん2009/01/03(土) 23:18:13
・・・??
0517デフォルトの名無しさん2009/01/03(土) 23:25:24
while("forever") ってしない?
0518デフォルトの名無しさん2009/01/03(土) 23:27:07
しない
0519デフォルトの名無しさん2009/01/03(土) 23:30:13
>>517
条件式じゃないと暴れだす奴がくるぞw
0520デフォルトの名無しさん2009/01/03(土) 23:34:54
>>517
そのアイデア貰った
0521デフォルトの名無しさん2009/01/03(土) 23:43:25
ちょ、それ古典w
0522デフォルトの名無しさん2009/01/03(土) 23:43:49
俺も面白いと思った。

while("無限ループ")
{
  /* なんか */
}

まあ、しないけど
0523デフォルトの名無しさん2009/01/03(土) 23:44:49
>>519
さすがにお前の粘着ぶりがキモイ
0524デフォルトの名無しさん2009/01/03(土) 23:46:13
while(j=10-i++) を書いた奴が指摘されて、まだファビョってるのか?
基地外だろ、こいつ。指摘した方が言ってもいないことを思っているとか言い出すし。
0525デフォルトの名無しさん2009/01/03(土) 23:49:41
whileの括弧の中が条件式でなければ駄目とは言っていないし、変数を用いて
0か否かで繰り返し条件を指定することもかのうだが、あの式は紛れもなく
代入式で、jの値を使うにしては、不適切だとコンパイラも指摘しているのだが・・・
0526デフォルトの名無しさん2009/01/03(土) 23:51:04
プw
0527デフォルトの名無しさん2009/01/03(土) 23:53:39
いやぁがんばってるね
0528デフォルトの名無しさん2009/01/03(土) 23:55:30
while(*dst++=*src++);
0529デフォルトの名無しさん2009/01/04(日) 00:00:53
>>525
>while文の括弧の中は、
>本来は条件式が入るんだが、それは代入だろ。例え括弧で代入式を括っても、
>それに対して条件式にあう措置をとるべき。
0530デフォルトの名無しさん2009/01/04(日) 00:03:01
>>524
ファビョってるのは「while文の中は、条件式が適切なのに、代入式で…」うんぬん
いってる>>442だろ
ながれ読めよ

>>525
>>456 で結論出てるのにいつまでやってんの?
0531デフォルトの名無しさん2009/01/04(日) 00:04:48
>>530
>>524=>>442で本人だからしょうがないんだよw
0532デフォルトの名無しさん2009/01/04(日) 00:15:46
最近よく喧嘩するね
0533デフォルトの名無しさん2009/01/04(日) 00:29:14
テュルー
0534デフォルトの名無しさん2009/01/04(日) 00:29:51
冬休みだからしかたない
0535デフォルトの名無しさん2009/01/04(日) 00:30:16
出た、「冬休み」
0536デフォルトの名無しさん2009/01/04(日) 00:37:35
connect(sock,( struct sockaddr * ) &echoservaddr, sizeof(echoservadr))

この文の * が意味することがまったくわかりません
*の後に文字もないのですが、ポインタとしてありえなくないでしょうか?
0537デフォルトの名無しさん2009/01/04(日) 00:38:30
ポインタ型でキャストしてるだけ
0538デフォルトの名無しさん2009/01/04(日) 00:51:54
人はなぜ>>534のような発言をするのか。
それは「私は子供ではない」と誇示したいからである。

では、「私は大人だ」と主張する人間が「大人」なのだろうか。
答えは否、断じて否である。
0539デフォルトの名無しさん2009/01/04(日) 00:56:57
で?
05405362009/01/04(日) 00:57:57
つまり&echoservaddr構造体のポインタを
sockaddr構造体のポインタとしてあつかうってことでしょうか?

まったく何をしているか理解できないのですが
0541デフォルトの名無しさん2009/01/04(日) 00:58:58
>>539
0542デフォルトの名無しさん2009/01/04(日) 01:00:57
>>540
その通りの事をやっている。
sockaddr_in 構造体を sockaddr 構造体であるかのように
無理矢理見なして渡している。
sockaddr_in 構造体と sockaddr 構造体はサイズが同じで、
かつ、こうやってキャストしてもいいと問題ないとされている。
0543デフォルトの名無しさん2009/01/04(日) 01:02:07
connect()の第2引数はstruct sockddr *型(struct sockddr型へのポインタ)を取る。
そこで、&echoservaddr(echoservaddrのアドレス)をstruct sockddr *型(struct sockddr型へのポインタ)へキャストしている。
05445362009/01/04(日) 01:03:51
>>542
見なす理由がわからないのです。
sockaddr_inのほうが入ってる情報というか入力する情報は多いし
その情報はconnectする際に必要だと思います。
なのに、何故必要な情報がすべてあひってないsockaddr構造体とみなすのかがよくわかりません
0545デフォルトの名無しさん2009/01/04(日) 01:07:27
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/connect.2.html

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

2番目の引数の型には、const struct sockaddr *が”必要”
05465362009/01/04(日) 01:08:58
必要な理由がわからないのです。
ていうか、入れてしまっては前述した疑問がわいてしまって
0547デフォルトの名無しさん2009/01/04(日) 01:10:08
理由は、connect()がそういう仕様だから。
connect()を作った人間がそういう風に作ったから。
0548デフォルトの名無しさん2009/01/04(日) 01:11:16
>必要な理由がわからないのです。

なんというか……
0549デフォルトの名無しさん2009/01/04(日) 01:12:22
>>544
総称的な型として sockaddr を用意して、
connect は sockaddr* を受け取る汎用的な形にしておいて、
より詳細な構造体として sockaddr_in を用意し、
それをキャストして渡す、という風になってんじゃないのかね。
場合によっては sockaddr_in 以外のものも作るつもりだった、
あるいは将来作れるように、そういう風にしてんじゃない?
void* でいいような気もするけど、
それだと何でもキャスト無しに渡せちゃうから、
渡していい構造体なのかどうか注意して指定させるように、
キャスト無しでは渡せないようにしているんだと思う。
まあ、全部推測だけどね。
05505362009/01/04(日) 01:13:40
つまりsockaddr_in 構造体の中にある入力したアドレスに接続するわけですよね。
しかしsockaaddr構造体にはアドレスがない。それなのに、sockaddr構造体とみなしてしまっては、
アドレスないから接続できなくないのでは?ということです。

0551デフォルトの名無しさん2009/01/04(日) 01:14:33
っていうか、全部が全部
現状が正しい前提で理由を付けなくてもいいと思うけど。
頭いいひとにありがちだよね。
0552デフォルトの名無しさん2009/01/04(日) 01:16:41
後の改造のために凝った事やって、
結局改造なんてしなかった、
ってこともよくある話で。
互換性のために、とかもよくある話。
0553デフォルトの名無しさん2009/01/04(日) 01:18:58
>>546
int connect(int sockfd, const void *addr, socklen_t addrlen);
なら、キャストする必要はないが、connect の第二引数が struct sockaddr である以上、
キャストする必要がある。
ここではキャストする型が重要なのではなく、socket作成時に指定したプロトコルファイミリーが重要。
プロトコルファミリーごとにconnectに必要な情報量は異なり、
kernelでもプロトコルファミリーごとに呼ばれるconnecが異なる。
kernelではaddrlen分ユーザー空間からメモリをコピーし、
所望の処理を行うので、struct sockaddr が重要なのではない。
0554デフォルトの名無しさん2009/01/04(日) 01:20:44
>>550
ああ、そういうことか。
sockaddr_inはsockaddrをIPv4に特化したもの。
sockaddr_inを使うのはIPv4だけだ。
connect()はIPv4以外でも使われる。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/socket.2.html

AF_INETの他に
AF_APPLETALKとかあるだろ。
05555362009/01/04(日) 01:26:58
>>554
socketでAF_INETを指定しているのですが、
この場合だとIPv4でconnectしてるということでは?
0556デフォルトの名無しさん2009/01/04(日) 01:34:20
>>555
そう。
sockaddr_inを使うのはsockaddrを使うより便利だから。
IPv4を使う場合でもsockaddrにアドレスを設定してもいいよ。でも面倒だよ。
ともかく、connect()が必要とするのはsockaddr_inではなくsockaddrなの。

/usr/include/sys/socket.h にstruct sockaddrとstruct sockaddr_inの定義があるから見比べてみてよ。
0557デフォルトの名無しさん2009/01/04(日) 01:36:55
>>550
sockaddrとしてもsa_familyが読み取れる。
そこがAF_INETならsockaddr_inにキャストしてアドレスを読み取るという風になっている。
ほかのAF_*にも対応するsockaddr_*が存在しうるという仕組み。

>>549
そういうことなんだろうけど、IPv6を収めるには小さすぎたのが惜しかった。
0558デフォルトの名無しさん2009/01/04(日) 01:39:57
どうせサイズ渡してんだし、
sockaddr::sa_family だけでよかった気もする。
05595362009/01/04(日) 01:42:07
struct sockaddr {
u_short sa_family;
char sa_data[14];
};

sockaaddr構造体はこのようになっているが、何も入力していない

struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};

inのほうはこのようになっていて、アドレスはポートやファミリーは入力している。

で、このinの方を
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
これとして扱う。しかし、ここにはアドレスが入っていない。
だとしたら、どうやってサーバーに接続する?という疑問がわきます。

けれど、inに入力したファミリーがsockaaddrに引き継がれて、
sockaddrのファミリがわかって、そこからまた、inの構造体を参照?するのでしょうか
どうやって参照するかがまた謎ですが
05605362009/01/04(日) 01:44:22
>sockaddrとしてもsa_familyが読み取れる。
>そこがAF_INETならsockaddr_inにキャストしてアドレスを読み取るという風になっている。

これだと、sockaaddrをキャストしてもsockaaddrにはポートやアドレス入力してなければ
読み取れないのでは?

0561デフォルトの名無しさん2009/01/04(日) 01:45:14
4.2BSDのsockaddrはsa_lenは無くて、sa_familyだけだった。
0562デフォルトの名無しさん2009/01/04(日) 01:46:55
IPv4として使う場合、
アドレスファミリをAF_INETにして
sockaddr_inにアドレス詰めて
connect()に渡すときはsockaddrにキャストして
connect()の内部ではsockaddr_inとしてアドレスを読み出す。
0563デフォルトの名無しさん2009/01/04(日) 01:48:29
>>561
それが合理的だな。

>>560
sockaddr_in を渡すのなら
sa_family に AF_INET を入れないといけないし、
sa_family に AF_INET を入れるのなら
渡す物は sockaddr_in でなくてはいけない。
それ以外の使い方して変になっても
それはそんな変な使い方をした人が悪い。
0564デフォルトの名無しさん2009/01/04(日) 01:48:51
>>560
入力してなければ読み取れないが、入力するためにsockaddr_inにしてポートやアドレスを入力するんだろ?
キャストしてもメモリの内容は変わらない。
0565デフォルトの名無しさん2009/01/04(日) 01:50:49
echoservaddr.sin_family = AF_INET;
echoservaddr.sin_port = xxx;
echoservaddr.sin_port = yyy;
connect(sock,( struct sockaddr * ) &echoservaddr, sizeof(echoservadr))

――connectの中
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
{
if (addr->sa_family == AF_INET)
{
const const struct sockaddr *addr_in = (const const struct sockaddr *)addr;
だいたいこんな感じのはず。
ここでaddr_in->sin_portを読めばxxxだし、addr_in->sin_addrからはもちろんyyyが読み取れる。
05665362009/01/04(日) 01:58:56
>connect()に渡すときはsockaddrにキャストして
>connect()の内部ではsockaddr_inとしてアドレスを読み出す。

つまり、connectに渡す情報は、空の
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
これであって、特に決まりで中に何も入力されてなくても意味はない。

で、内部でどこのアドレスに接続するか処理するのが、
struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
この入力しておいたinの方。ってことでいいのでしょうか。

inをsockaddrにキャストしても入力しておいた値で共通する変数名とかないですもんね
だからキャストしても??
0567デフォルトの名無しさん2009/01/04(日) 02:00:32
空じゃなくてアドレス等を入力したものをsockaddrとみなして渡してる。
(( struct sockaddr * ) &echoservaddr)->sa_data[2]〜[5]とか見れば納得するのかな?
0568デフォルトの名無しさん2009/01/04(日) 02:04:55
>>566
connectに渡しているのは構造体のアドレス。内容は渡していない。
0569デフォルトの名無しさん2009/01/04(日) 02:10:06
#include <stdio.h>

void print_bytewise(const unsigned char *buf, size_t size) {
 size_t i;
 for (i = 0; i < size; i++) {
  printf("%02X ", buf[i]);
 }
 putchar('\n');
}

int main(void) {
 int n = 0x12345678;
 print_bytewise((const unsigned char*)&n, sizeof n);
 return 0;
}

これとやってる事は本質的に同じ。
05705362009/01/04(日) 02:13:08
>>567
struct sockaddr_in {
u_short sa_family;
char sa_data[14];
[0]short sin_family;
[1]unsigned short sin_port
[2]struct in_addr sin_addr
[3]char sin_zero[8];
};

つまり、イメージ的にはこうなのかな?
0571デフォルトの名無しさん2009/01/04(日) 02:17:05
こう。

sa_family          ⇔ sin_family (2 バイト)
sa_data[0]〜sa_data[1] ⇔ sin_port (2 バイト)
sa_data[2]〜sa_data[5] ⇔ sin_addr (4 バイト)
sa_data[6]〜sa_data[13] ⇔ sin_zero (8 バイト)
0572デフォルトの名無しさん2009/01/04(日) 02:23:51
connect(2)ってだいたいこんな感じで使うだろ。

struct sockaddr_in addr = {
.sin_family = AF_INET,
.sin_port = htons(80),
.sin_addr = {
.s_addr = inet_aton("192.168.1.1")
}
};

connect(skfd, (struct sockaddr *)&addr, sizeof(addr);

>>536はなにか勘違いしてる気がしてならない。
05735362009/01/04(日) 02:34:31
>>571
お!
もしかして
sockaddr_inは、計16バイトでその情報はsockaddrに全て対応する
sa_family はsinfamilyに
sa_data[14]には残りの14バイトのアドレスが格納されるということになってるのかな

だとすると、どちらかの構造体だけ入力しとけばいいってのも納得できるのですが
これでいいのでしょうか?
0574デフォルトの名無しさん2009/01/04(日) 02:46:42
>>573
いままでの回答全て無駄っぽい。
sockaddrはアドレスファミリーから見れば関係ないんだって。
例えばUNIX ドメインソケットなら sockaddr_un だし、
IPv4なら sockaddr_in がconnectには必要。
ただ、歴史的背景かなにかはしらないが、connect(2)のインターフェースが
「void *」ではなく、「sockaddr *」になってるってだけ。
05755362009/01/04(日) 02:56:41
>>574
つまり>>571ではないと?
ますますわけわかんなくなってきた

struct sockaddr* をキャストの型として &echoservaddrするってのがよくわからないのかなぁ

&echoservaddrには>>572にかいてあるようなin構造体のアドレスが入力ずみではあるけど
それをキャストすると、どう扱われるってのがよくわかんないかも

いや、本当にみなさんに色々教えてもらっているのに理解がたりなくて申し訳ないです。
キャストとかsockaaddrとかぐぐってるけど、いまいち理解できない・・・
0576デフォルトの名無しさん2009/01/04(日) 03:01:20
>>575
>>571 であってる。
まず、>>569 が理解できるか確認してくれ。
05775362009/01/04(日) 03:11:36
>>576
すみません。まったくわかりません。
const unsigned char*)&n
char型(nの値が格納されている)アドレスへのポインタ

なんかもうわかりません
0578デフォルトの名無しさん2009/01/04(日) 03:18:13
ま、深夜だし思う存分続けてくれたまえ
0579デフォルトの名無しさん2009/01/04(日) 03:27:31
>>577
典型的な「ポインタを理解していない」状態だね。
まあ、初心者は大抵一度は通る道だ。

ポインタを理解するのは簡単だ。メモリを理解すれば良い。ただそれだけだ。

変数とかの中身はメモリに置かれている。
メモリは1バイト単位に分割されていて、それぞれのバイトに住所が割り振られている。

[0番地][1番地][2番地]・・・

でも、例えば int とかのサイズは1バイトではない。現在は4バイトが主流だね。
こういうのは、メモリ上の連続した領域を占有することになる。
そして、int 型の変数(例えば >>569 の n)に & をつけると、
この連続した4バイトの領域の先頭のバイトの住所が取得できる。

[----------------------- int n ------------------------]
[12938100番地][12938101番地][12938102番地][12938103番地]   (住所は一例)
   ↑
  先頭   &n == 12938100番地

でも、別にこの4バイトの領域を int の値と見なさなくてはいけないわけではない。
例えば勝手に char 4要素の配列だと見なしても構わないわけだ。

[-- char [0] --][-- char [1] --][-- char [2] --][-- char [3] --]
[12938100番地][12938101番地][12938102番地][12938103番地]

んで、この char 4要素の配列の先頭要素の住所もやっぱり12938100番地なわけだ。

こういう解釈の変更を行っているのが、
(const char*)&n みたいなキャストになるわけだ。
0580デフォルトの名無しさん2009/01/04(日) 03:39:44
ポインタってのは2つの属性から構成されている。
1つはメモリ上の占有している領域の先頭の住所(アドレス)と、
そしてそのアドレスにある値を「何の型の値だと見なすか」だ。
ある変数のポインタは、変数に & をつけることで得られる。

変数に & を付ける事によって得られるポインタの型は、
元の変数の型に * をつけた形で表現する。
ポインタは基本的にただアドレスなんつー単なる値を保持するだけのもんなので、
ポインタを保持する変数なんかも作る事ができる。
例えばこんな感じだ。

int *p = &n;

変数 p は n のアドレス、例えば12938100番地などといったような値を保持しているわけだ。
んでさらに、p は int* という型なわけだが、
この int って部分は、12938100番地から始まる領域を int 型の値だと見なすよ、って意味を持っている。

これを char 型の値だと見なしたい場合は、char* にキャストしてしまえばいい。

char *c = (char*)p;

これで、やっぱり変数 c には p に入れられていた領域と同じ場所を指すアドレスが入れられる激Xが入れられるわけだけど、
c の型は char* なんで、その領域を char 型の値だと見なすようになるわけだ。

この話の int と char を sockaddr_in と sockaddr に置き換えれば、
connect に関する話も分かるはず。
0581デフォルトの名無しさん2009/01/04(日) 03:46:11
ポインタ……それは恋だ!
■ このスレッドは過去ログ倉庫に格納されています