- 締切済み
C ポインタに型
Cのポインタに型があるのはなぜですか? 先頭アドレスを指し示すだけならポインタ型のような「アドレスを保存します」って型で統一したほうがわかりやすくないですか?
- tanakanono
- お礼率69% (269/385)
- C・C++・C#
- 回答数7
- ありがとう数6
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- unokwave
- ベストアンサー率58% (966/1654)
>1バイトの型と2バイトの型があったとして、1バイト読み込めばいいのか2バイト読み込めばいいのか判断するために型も一緒に教えてあげるってことですね。 判断は自動的に判断させるため、ですね。 それとポインタには関数ポインタというのもあります。 この場合には関数の引数の有無や型の情報も関数ポインタに含まれます。
- unokwave
- ベストアンサー率58% (966/1654)
アドレスを保持する定義型は存在します。 uintptr_tとintptr_tです。 アドレスの演算用にはptrdiff_tという定義型もあります。 ポインタは何かを指し示しています。 つまり何らかのオブジェクトを指しているわけですが、その指している先の型と合わなければ、データを正しく読み書きできる保障がなくなります。 例えるなら、役所への申請書に住所だけが書かれていて、申請の目的も何もわからないような申請書が良いと言っているようなものです。 役所の窓口では、申請者に意図を聞いて、その都度必要な事を聞きながら処理をしたほうが良いのか、必要なことをすべて書いてもらった申請書を見ながら処理をしたほうが良いのか、です。 ポインタに指しているアドレスにあるオブジェクトの型情報があれば、その型に応じた処理をこなすだけで済みます。
- superside0
- ベストアンサー率64% (452/698)
ポインタを参照して、そのアドレスの値を取り出したり、そこに代入したりするとき 先頭アドレスから 何bitを使うデータなのかが 型(int,short,long,long long, char, float, double,...等々)によって異なります。 たとえば、 32bitデータの入っていることを示しているポインタを使って そこに64bitのデータを代入してしまうと、 隣にある別のデータを壊してしまうことになります。 つまり、型の情報ないとポインタを使ったデータの受け渡しが正しく出来ません。 アドレスの大小比較だけできればよくて、 それが示している中身は関係ないという計算のときだけは、型は無視できますけど。
お礼
よくわかりました。ありがとうございます。 言われればその通りで、聞く前に気づかなかったのが悔やまれます。
- hiodraiu
- ベストアンサー率15% (448/2823)
統一したら分かりやすくなるケースってどんな場合? もしかして「先頭アドレスを指し示すだけなら」ってとこが質問の要点ですか? ポインター変数って先頭を指し示すだけじゃないですよね。次のデータを参照することもありますよね。データ型によって次のデータは何バイトずれるのかは違いますよね。
お礼
確かにそうでした。質問するとき頭が死んでいたみたいです。
int、char、アドレス。 この勉強から復讐されると良いかと思います。 なぜそれらの方があるのかを理解できればわかります。 ポインタ以前の初歩の話ですので、そちらから復讐された方が良いですよ。
お礼
はい。
- wormhole
- ベストアンサー率28% (1621/5657)
では、そのアドレスにあるデータの型はどうやったらわかりますか。 アドレスだけわかればいいというのでしたら、 typedef void * pointer; と型定義してpointerで統一してみてはいかがでしょうか。
お礼
はい。
関連するQ&A
- C言語の型と配列
char* str[10]={"a","b"}; char* str2="c"; としたときにstr=str2とすると 型が合わないといったエラーが出ます。 でもstrって結局はポインタの配列の先頭要素のアドレスですよね。 ポインタにポインタを入れているので通るのかなと思ったんですけど、 配列で宣言するとポインタにも型がつくのでしょうか? この例だと strは char * を10個持つ配列をさすポインタ で、 str2はchar *をさすポインタ みたいなかんじです。 質問の意味がわかりにくいですが、ご指摘をいただければ補足しますので よろしくお願いします。
- ベストアンサー
- C・C++・C#
- Voidポインタで受け取った変数の型を調べる方法
あるライブラリの関数を利用しようとしたのですが、その関数の引数にVoidポインタがあり、どういう型のデータを格納したのかわかりません。このポインタのアドレスに格納されたデータの型を調べる関数なり方法なりというのはあるのでしょうか。 Voidポインタというのは型を問わずに受け取れるというのは利点ですが、受け取ったものがあらかじめなんだかわからない場合はどうするのでしょうか。よろしくお願いします。
- ベストアンサー
- C・C++・C#
- ポインタに含まれる情報は [C言語]
ポインタに含まれる情報は代入した変数のアドレスですが、アドレス元の変数の大きさは含まれないのでしょうか?ポインタの中の情報を見てみても、参照できる変数が使用しているメモリの先頭アドレスしか入っていません。変数の大きさはどうやって知るのでしょか?回答よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C言語のvoid型ポインタを使いたいのですが…
C言語のvoid型ポインタを使いたいのですが… 関数の引数として、void型ポインタを使おうと思ったのですが、内部でどのように処理すればいいのかわかりません キャストすれば問題なく使えるとのことですが、どの型でキャストするのかをどのように判断するのかがわかりません 具体的には、画像処理で画像の構造体をいくつか作ったのですが、それぞれの構造体ごとに関数を書くと関数が多くなるので、void型ポインタでまとめてつくろうとしています どのように型の判断を行えばいいのかを教えてください
- ベストアンサー
- C・C++・C#
- C#でポインタのポインタを作りたい
昔VC++で作ったDLLをC#で使おうと思ったのですが、なんと、その引数がint**型です。 やっていることは、intの配列がありまして、その配列の特定の要素のアドレスを納めた配列を使っています。 具体的には(型や関数記述は大まかに書きます) --------------------------------- int **array; int *item; array = calloc(10, sizeof(int)); item = calloc(1000, sizeof(int)); for (i = 0; i < 10; i++) { array[i] = item + i+100; } --------------------------------- とした、arrayを引数にしています。 これをC#から使おうとして、C#ではint**をどうするんだろうと思った次第です。 わからないのは、C#でどうやってアドレスを配列に入れるかです。 array[i] = &item[width*i] とすると、コンパイル段階で怒られてしまいますし... 知恵をお貸しください。
- ベストアンサー
- C・C++・C#
- ポインタの基礎について
Cのポインタに関して、質問されて答えられなかったものがありまして、お尋ねしたいと思います。 long型の変数へのポインタは[ ]型 char *型の変数へのポインタは[ ]型 このような[ ]に入る語句が分からないです。 教えて下さい!!
- ベストアンサー
- C・C++・C#
- 関数ポインタを返す関数の型をtypedefする方法
C言語について質問します。 ある関数を定義するとします。 その関数は引数としてintを一つ取り、返値としてその関数と同じ型の関数へのポインタを返すようにしたいのですが、どのように書けばよいのでしょうか? そして、その関数の型をtypedefで定義したいです。 例えば、FNをtypedefしたいその関数の型だとすると、 typedef FN (*FN)(int); のようなFNを定義したいのですが、上のように書いても当然コンパイラ(VC9)に怒られます。 最悪、 typedef void* (*FN)(int); とvoidポインタを返すように定義しておいて、そのポインタを返値として受け取った側でFNにキャストし直す方法で対処できなくもないですが、ちょっと強引過ぎる気がします。 何かいい方法はあるのでしょうか? boost::functionあたりを使えばできそうな、そうでもないような気がしますが、できれば純粋なCでの解決法を望みます。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
お礼
わかった気がします。 1バイトの型と2バイトの型があったとして、1バイト読み込めばいいのか2バイト読み込めばいいのか判断するために型も一緒に教えてあげるってことですね。