• 締切済み

C ポインタに型

Cのポインタに型があるのはなぜですか? 先頭アドレスを指し示すだけならポインタ型のような「アドレスを保存します」って型で統一したほうがわかりやすくないですか?

みんなの回答

  • unokwave
  • ベストアンサー率58% (966/1654)
回答No.7

>1バイトの型と2バイトの型があったとして、1バイト読み込めばいいのか2バイト読み込めばいいのか判断するために型も一緒に教えてあげるってことですね。 判断は自動的に判断させるため、ですね。 それとポインタには関数ポインタというのもあります。 この場合には関数の引数の有無や型の情報も関数ポインタに含まれます。

  • unokwave
  • ベストアンサー率58% (966/1654)
回答No.6

アドレスを保持する定義型は存在します。 uintptr_tとintptr_tです。 アドレスの演算用にはptrdiff_tという定義型もあります。 ポインタは何かを指し示しています。 つまり何らかのオブジェクトを指しているわけですが、その指している先の型と合わなければ、データを正しく読み書きできる保障がなくなります。 例えるなら、役所への申請書に住所だけが書かれていて、申請の目的も何もわからないような申請書が良いと言っているようなものです。 役所の窓口では、申請者に意図を聞いて、その都度必要な事を聞きながら処理をしたほうが良いのか、必要なことをすべて書いてもらった申請書を見ながら処理をしたほうが良いのか、です。 ポインタに指しているアドレスにあるオブジェクトの型情報があれば、その型に応じた処理をこなすだけで済みます。

tanakanono
質問者

お礼

わかった気がします。 1バイトの型と2バイトの型があったとして、1バイト読み込めばいいのか2バイト読み込めばいいのか判断するために型も一緒に教えてあげるってことですね。

回答No.5

ポインタを参照して、そのアドレスの値を取り出したり、そこに代入したりするとき 先頭アドレスから 何bitを使うデータなのかが 型(int,short,long,long long, char, float, double,...等々)によって異なります。 たとえば、 32bitデータの入っていることを示しているポインタを使って そこに64bitのデータを代入してしまうと、 隣にある別のデータを壊してしまうことになります。 つまり、型の情報ないとポインタを使ったデータの受け渡しが正しく出来ません。 アドレスの大小比較だけできればよくて、 それが示している中身は関係ないという計算のときだけは、型は無視できますけど。

tanakanono
質問者

お礼

よくわかりました。ありがとうございます。 言われればその通りで、聞く前に気づかなかったのが悔やまれます。

  • hiodraiu
  • ベストアンサー率15% (448/2823)
回答No.4

統一したら分かりやすくなるケースってどんな場合? もしかして「先頭アドレスを指し示すだけなら」ってとこが質問の要点ですか? ポインター変数って先頭を指し示すだけじゃないですよね。次のデータを参照することもありますよね。データ型によって次のデータは何バイトずれるのかは違いますよね。

tanakanono
質問者

お礼

確かにそうでした。質問するとき頭が死んでいたみたいです。

noname#252929
noname#252929
回答No.3

int、char、アドレス。 この勉強から復讐されると良いかと思います。 なぜそれらの方があるのかを理解できればわかります。 ポインタ以前の初歩の話ですので、そちらから復讐された方が良いですよ。

tanakanono
質問者

お礼

はい。

  • chachaboxx
  • ベストアンサー率23% (412/1777)
回答No.2

公園に散歩に行くのに、スーツケースは合理的とは言えない感覚です。ダメというわけではありません。

tanakanono
質問者

お礼

はい。

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

では、そのアドレスにあるデータの型はどうやったらわかりますか。 アドレスだけわかればいいというのでしたら、 typedef void * pointer; と型定義してpointerで統一してみてはいかがでしょうか。

tanakanono
質問者

お礼

はい。

関連するQ&A

  • C言語の型と配列

    char* str[10]={"a","b"}; char* str2="c"; としたときにstr=str2とすると 型が合わないといったエラーが出ます。 でもstrって結局はポインタの配列の先頭要素のアドレスですよね。 ポインタにポインタを入れているので通るのかなと思ったんですけど、 配列で宣言するとポインタにも型がつくのでしょうか? この例だと strは char * を10個持つ配列をさすポインタ  で、 str2はchar *をさすポインタ みたいなかんじです。 質問の意味がわかりにくいですが、ご指摘をいただければ補足しますので よろしくお願いします。

  • C言語の型キャスト

    C言語入門者です、よろしくお願いします C言語の型キャストについて教えてください 参考サイトで以下のようになってました char str[8] = "ABC"; char *ptr; ptr = (char*)str; printf("char型ポインタのアドレス先の値は: %s\n", ptr); この型キャストって意味ありますか? キャストしようがしなかろうがptrに収まるのはstrの先頭アドレスですよね? ただ型キャストを説明するためだけにこのような形にしているのか 意味がある型キャストなのかが解らず迷ってます

  • Voidポインタで受け取った変数の型を調べる方法

    あるライブラリの関数を利用しようとしたのですが、その関数の引数にVoidポインタがあり、どういう型のデータを格納したのかわかりません。このポインタのアドレスに格納されたデータの型を調べる関数なり方法なりというのはあるのでしょうか。 Voidポインタというのは型を問わずに受け取れるというのは利点ですが、受け取ったものがあらかじめなんだかわからない場合はどうするのでしょうか。よろしくお願いします。

  • ポインタに含まれる情報は [C言語]

    ポインタに含まれる情報は代入した変数のアドレスですが、アドレス元の変数の大きさは含まれないのでしょうか?ポインタの中の情報を見てみても、参照できる変数が使用しているメモリの先頭アドレスしか入っていません。変数の大きさはどうやって知るのでしょか?回答よろしくお願いします。

  • ポインタの宣言

    ポインタを宣言するとメモリ上に、ポインタ変数を格納するための領域が確保されます。ポインタ=アドレスというのは大丈夫なのですが、 int *b のようにどうして、ポインタに型があるのでしょうか?単に変数のアドレスを表示するだけならば型はいらないと思うのですが。 またこのとき宣言された変数は *b ではなくて b であってますよね?

  • C言語のvoid型ポインタを使いたいのですが…

    C言語のvoid型ポインタを使いたいのですが… 関数の引数として、void型ポインタを使おうと思ったのですが、内部でどのように処理すればいいのかわかりません キャストすれば問題なく使えるとのことですが、どの型でキャストするのかをどのように判断するのかがわかりません 具体的には、画像処理で画像の構造体をいくつか作ったのですが、それぞれの構造体ごとに関数を書くと関数が多くなるので、void型ポインタでまとめてつくろうとしています どのように型の判断を行えばいいのかを教えてください

  • 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のポインタに関して、質問されて答えられなかったものがありまして、お尋ねしたいと思います。 long型の変数へのポインタは[ ]型 char *型の変数へのポインタは[ ]型 このような[ ]に入る語句が分からないです。 教えて下さい!!

  • 関数ポインタを返す関数の型をtypedefする方法

    C言語について質問します。 ある関数を定義するとします。 その関数は引数としてintを一つ取り、返値としてその関数と同じ型の関数へのポインタを返すようにしたいのですが、どのように書けばよいのでしょうか? そして、その関数の型をtypedefで定義したいです。 例えば、FNをtypedefしたいその関数の型だとすると、 typedef FN (*FN)(int); のようなFNを定義したいのですが、上のように書いても当然コンパイラ(VC9)に怒られます。 最悪、 typedef void* (*FN)(int); とvoidポインタを返すように定義しておいて、そのポインタを返値として受け取った側でFNにキャストし直す方法で対処できなくもないですが、ちょっと強引過ぎる気がします。 何かいい方法はあるのでしょうか? boost::functionあたりを使えばできそうな、そうでもないような気がしますが、できれば純粋なCでの解決法を望みます。 よろしくお願いします。

専門家に質問してみよう