プロが教えるわが家の防犯対策術!

ポインタを宣言するとメモリ上に、ポインタ変数を格納するための領域が確保されます。ポインタ=アドレスというのは大丈夫なのですが、

int *b

のようにどうして、ポインタに型があるのでしょうか?単に変数のアドレスを表示するだけならば型はいらないと思うのですが。

またこのとき宣言された変数は *b ではなくて b であってますよね?

A 回答 (12件中1~10件)

変数のアドレスというものは、表示するためにあるのではなく、使うためにあるのです。


メモリ上に確保されたint変数のアドレスだけ分かっても、どうやって使えばいいかわからないですよね?
そのために、intのアドレスを入れるための変数を作り、そこにアドレスを格納して使うのです。

int bの中にあるアドレスを見に行って、そこにある値を見たり、書いたりって感じです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。残念ながらいまいちよくわかりません。
ではdoubleやcharの型の場合だとintと何が異なるのでしょうか?
メモリ上で確保する領域のサイズは同じはずですよね?

お礼日時:2008/11/28 20:17

>単に変数のアドレスを表示するだけならば型はいらない


C言語では、型はその型分類によって特徴付けるという
前提があるからです。
# JIS X3010 - 6.2.5 あたり

それぞれの型分類は規約で規定されるか処理系に
依存するかのいづれかとなります。
ポインタにも型分類がないと、関数なのか、
整数なのか配列なのかといったような分類ができないからでしょう。
#ポインタ型については規約に規定されていると思います。

>どうして ポインタに型があるのでしょうか?
そういう細かいところが気になるのでしたら、
C言語やC++の規格書などを一読する事をお勧めします。

>またこのとき宣言された変数は *b ではなくて bであってますよね?
あっていると思います。
# int* 型の d という変数になります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。初心者の自分にはハードルの高い内容ですね。いつかチャレンジしたいと思います。

お礼日時:2008/11/28 20:24

こんばんは.



ポインタに型がある理由の一つは「ポインタ演算」のためです.
int num[2], *pnum;
なる宣言があるとして,
pnum = num;
とすれば *pnum はnumの先頭の値を参照します.
次に
pnum++;
とすると *pnum はnumの2番目の値を参照します.
ごく普通にやっていることですが,上記のことを行うには
pnum = pnum + 1
という演算が「pnumをint型のサイズだけ移動する」ことでなければなりません.
単純に pnum がアドレスの値だけを格納していて,それを1加算する意味しか持たないなら,
pnum++ はint型(大体は32bit)の変数の「途中」を指してしまいます.

要するにポインタに型があることで「加減算のときの飛び幅」を自動的に調整できます.
実際,
double *pdnum;
に関して, pdnum++; としたときと pnum++;としたとき,
それぞれがdouble型要素一つ分,int型要素一つ分ジャンプしてくれることでしょう.
ですが,型がなければ上記の演算は
pdnum += sizeof(double)
pnum += sizeof(int)
と書かねばならないということです.
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2008/11/29 00:32

この疑問は核心をついたというか、考え方は間違ってないと思います。


むしろ私も、文字はchar、整数はint、だったらアドレスはint*とかじゃなくてpoint型だろうと思うんですよね。
ちなみに漠然とアドレスを渡したい場合が実際ありまして、そういう場合は「void*」という宣言を使います。

型が必要な理由は、もう既に十分な回答が出ているようですね。
私流に言うと「int a = 3.14;」これがエラーになるのと同じ理由です。
int a=0;
int* p = &a;
*p = 100; //a=100;
*p = 3.14; //a=3.14;これはエラーにしないとまずいですよね? だから整数を示すためにint*が必要。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2008/11/29 00:33

> メモリ上で確保する領域のサイズは同じはず



えーと……

sizeof(char)
sizeof(int)
sizeof(double)

さてそれぞれいくつになるでしょうか。
問題なのは「アドレスのサイズ」じゃなくて「アドレスが指す先にあるもののサイズ」なのです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2008/11/29 00:34

>#4さん


>*p = 3.14; //a=3.14;これはエラーにしないとまずいですよね? だから整数を示すためにint*が必要。

なぜエラーにしないとまずいのですか?
pが指すint型の領域に、3.14の小数点以下を切り捨てた3が正しく入りますよ。
何か勘違いされてませんか?
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2008/11/29 00:35

>メモリ上で確保する領域のサイズは同じはずですよね?



sizeof(char *)とsizeof(int *)とが同じであることと、
sizeof(char)とsizeof(int)とが異なることとを
混同なさっていませんか?
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
僕の環境ではsizeof(char *)とsizeof(int *)は違いました。それぞれ4、1でした。

お礼日時:2008/11/29 00:40

>#4さん


>私流に言うと「int a = 3.14;」これがエラーになるのと同じ理由です。

そもそも、これがエラーを起こすというのが間違いの始まりですね。
コンパイルすると警告は出るかもしれませんが、
int型の変数aに3という値を「正しく」格納します。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2008/11/29 00:41

>No6さん


私のコンパイラではワーニングになりました。
例えが悪かったみたいですね、その点はすみませんでした。
しかし質問への回答として、本質的な部分で間違えているとは思いません。
勿論実行する上で支障はないでしょうが、型について語る時に3.14(float)と3(int型)が同じ扱いで良いわけがありません。

>No.7さん
>どうして、ポインタに型があるのでしょうか?
まず大前提はこの質問です。
>ではdoubleやcharの型の場合だとintと何が異なるのでしょうか?
>メモリ上で確保する領域のサイズは同じはずですよね?
だとすれば、doubleやcharは暗黙的にcouble*やchar*と解釈できると思うのですが。
No.7さんが仰るとおり、double*もchar*もint*も確保するサイズは同じはずです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

double*もchar*もint*も確保するサイズは同じはずです

とのことですが、よく考えたらそうですよね。
しかし

#include <stdio.h>
#include <stdlib.h>

/*
*
*/
int main(int argc, char** argv) {

int a;
int *b;
char c;
char *d;

printf("%d",sizeof(a));
printf("%d",sizeof(*b));
printf("%d",sizeof(c));
printf("%d",sizeof(*d));

return (EXIT_SUCCESS);
}

でためしたらそれぞれ4411でintとcharのサイズが同じになりました。どこが間違えでしょうか?

お礼日時:2008/11/29 01:05

>どうして、ポインタに型があるのでしょうか?


>単に変数のアドレスを表示するだけならば型はいらないと思うのですが。

ポインタが指すアドレスからデータを出したり、データを入れたりする場合や、ポインタを動かす場合に、データサイズが判らないと困ります。

例えば、ポインタが1254番地を指している場合「ポインタが指す1254番地からデータを取り出して」と言われた場合、そこにあるデータが「charのデータ」なのか「intのデータ」なのか判らないと、取り出せません。

また、ポインタが1254番地を指している時「1つ進めて」と、ポインタに1を足した場合、アドレスを幾つ進めれば良いか判りません。

なので「ポインタにも型が必要」なのです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

「ポインタが指す1254番地からデータを取り出して」と言われた場合、そこにあるデータが「charのデータ」なのか「intのデータ」なのか判らないと、取り出せません。

(初歩的なことですが)これはデータが複数の番地にまたがって存在しているし、charとintでそれぞれサイズがことなるからですよね?

お礼日時:2008/11/29 01:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!