アプリ版:「スタンプのみでお礼する」機能のリリースについて

VC++.NETを、入門書で勉強しています

ぐぐったりしてみたのですが、ポインタというのが、いまいちわかりません。

【質問】ポインタとは、何なのですか?また、どういう時に利用するのですか?利用の仕方も教えていただければ幸いです

A 回答 (3件)

ポインタの基礎をちょっとだけ触ってみましょう。



int num;を宣言し、仮にnum=139;としたとき。
printf("%d", num);の結果が139と表示されるのはご周知のとおりだと思います。

このとき、メモリ上にnumのデータが書き込まれている場所、それをアドレスといいます。
次に、int *p;と宣言したときpというポインタができます。
それでは、このポインタとは何なのか?抽象的にいってしまえば「どこでもドア」といったところでしょうか。
pという「どこでもドア」はこの時点では何にも行き先が指定されていないのでどこにもいけません。それではドラえもんが「numのデータがある場所に行きたい」としたときはp=#(&をつける事で&numはnumの場所の情報〔アドレス〕を表す)として「どこでもドア」pにnumまでの行き先を入力します。これで、numの場所までいけるようになりました。
printf("%d", *p);というように、pにアスタリスクを
つけるとドアの向こうはnumの値、つまり139がおいてありますのでこの情報をprintf()関数に渡すことになります。139が表示されます。ポインタの型はここではint型だったのでnumの型もint型でなければなりません。

char str[100]="Hello World";といった文字列配列を作ったとき、strというポインタができています。これは既にstr[0]のアドレスをさしています。
printf()関数で文字列を表示させるとき、printf(str);としたらHello Worldと表示されますstrのままだとstrのアドレス情報がprintf()関数に渡され、関数がそのアドレス情報を利用して表示しているのです。
関数などを自分で作ったりするうちにその便利さがわかってきます。長文、失礼しました。

sample.(そのままコンパイルして大丈夫です)
#include <stdio.h>
int main(void)
{
float *p, f;
f=20.3;
p=&f;
printf("*p = %f, f = %f\n", *p, f);

*p=14.9; /* pを通してfに新たな値を代入する事もできる */
printf("f の値が %f に書き換えられた", f);

return 0;
}
    • good
    • 0
この回答へのお礼

とても詳しく説明していただき、ありがとうございました
がんばりたいと思います

お礼日時:2005/04/04 10:29

ポインタは、一言でいうと次のようになるでしょうか。



「ある型の変数や値の格納されている領域を指し示すためのもの (ポイントするもの = ポインタ)」

要するに、どこにその変数なり値なりが格納されているのか、その情報を持っているものということになります。

ま、実際には「格納されている領域を指し示すためのもの」として「アドレス」が使われているので次のように言い換えても良いと思います。

「ある型の変数や値のアドレス」

もう少し突っ込んで説明してみます。

まず最初に「ポインタ型」という型があります。
ポインタ型はそれだけで存在するのではなくて、「int型へのポインタ型」とか「char型へのポインタ型」というように、int型やchar型など元になる型があって、そこから派生する型です。

ポインタ型はint型やchar型と同じように「型」ですから、ポインタ型の変数とかポインタ型の値があります。

この「int型へのポインタ型」と「char型へのポインタ型」は別の型だということをしっかりと認識しておいてください。

たとえば、

--------------------------------------------------------
int* p_hoge; /* int型へのポインタ */

--------------------------------------------------------

と定義したら、p_hoge は「int型へのポインタ型の変数」になります。

また、次のようにすることでポインタ型の値を取得することができます。

--------------------------------------------------------
int hoge; /* int型の変数 */
int* p_hoge; /* int型へのポインタ */

p_hoge = &hoge;

--------------------------------------------------------

&hoge が「int型へのポインタ型」の値になるわけですが、実際にどのような値が設定されているかは、printf() で確認できます。

--------------------------------------------------------
int hoge; /* int型の変数 */

printf( "hogeへのポインタの値=%p\n", &hoge );

--------------------------------------------------------

おそらく 16進数 8桁の数値が表示されると思いますが、ここで表示されている値が「int型へのポインタ型の値」になります。
つまり、hoge という変数が格納されている場所を指すアドレスです。

ちなみに、一般に「ポインタ」といった場合、次の3つのどれかを指していることが多いように思います。

1. ポインタ型
2. ポインタ型の変数
3. ポインタ型の値

さて、実際にプログラミングする場合には、ポインタをアドレスだというふうに考えてプログラミングすることはほとんどないと思います。

ポインタ経由でそれが指している変数なり値なりを参照できる、というように考えることが多いと思います。
上記の例では「*p_hoge とすれば hoge に設定されている値を見ることができる」という感じです。

で、使われ方ですが、一番良く使うのは配列絡みのところでしょうか。
このあたりの説明をしだすと、また長くなりますので詳細は割愛します。
# ここまででも十分長くなっちゃったしねぇ。。。

単純に言うと C では配列を扱うのが苦手なので、関数の引数に配列を渡したい場合には、代わりに「配列の先頭要素へのポインタ」を渡すことになります。

これは C 特有の言語仕様による制約のようなものになりますが、C 言語以外でも使えるものとしては「リスト構造」を作る場合でしょうか。
同じ型の変数を数珠つなぎにリンクしていく構造をリスト構造といっていますが、次の変数にリンクするのにポインタが使われるわけです。
# リスト構造の詳細は、構造体も絡んでくるので割愛します。

こんな感じでいかがでしょうか。
# 長々と失礼しました。
    • good
    • 0
この回答へのお礼

初心者にもわかりやすく説明していただき、ありがとうございました

お礼日時:2005/04/04 10:30

Googleで「ポインタ」というワードで検索したら、たくさんでてきましたが。



ゆっくり、いろんなサイトの文章を読めばわかるはずです。。

参考URL:http://www.google.com/search?hl=ja&q=%E3%83%9D%E …
    • good
    • 0

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