みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ポインタについて

今初めてポインタというものを勉強しております。
よろしくお願いします。

◎1----------------------------------
#include<stdio.h>
int main(void)
{
int mydt=1234;
int *pt;

pt=&mydt;

printf("*pt=%d\n",*pt);
printf("&mydt=%p\n",&mydt);

return 0;
}
---------------------------------------
◎1のようにmydtのアドレスをポインタptに代入すれば、このプログラムは正常に動きました。

◎2-----------------------------------
#include<stdio.h>
int main(void)
{
int mydt=1234;
int *pt=&mydt;

printf("*pt=%d\n",*pt);
printf("&mydt=%p\n",&mydt);

return 0;
}
----------------------------------------
◎2で「int *pt=&mydt;」があまりどういう意味かはわかりませんが、これも正常に動きました。

◎3------------------------------------
#include<stdio.h>
int main(void)
{
int mydt=1234;
int *pt;

*pt=&mydt

printf("*pt=%d\n",*pt);
printf("&mydt=%p\n",&mydt);

return 0;
}
--------------------------------------
◎3のように◎2と違って「*pt=&mydt」の代入を後から行うと、「'=' : 'int *__w64 ' から 'int' に変換できません。」といったようなエラーが起きてしまいます。

◎1と◎2の違い、後何故◎3はダメなのかがわかりません。
教えていただけると嬉しいです。

後補足として、配列とポインタについてですが、
◎4------------------------------
char ss[10]="ABCDE";
char *ssp=ss;
---------------------------------
◎5----------------------------
char ss[10]="ABCDE";
char *ssp;
ssp=ss;
--------------------------------
◎4と◎5も同じような事だとは思いますが違いを教えていただけると嬉しいです。
よろしくお願いします。

投稿日時 - 2009-02-06 18:45:05

QNo.4694845

困ってます

質問者が選んだベストアンサー

簡単に言うと、ポインタとは、住所の入れ物、もっと平たく言えば、住所を書いたメモです。
mydt は単なる変数であり、データの入れ物です。
しかし、実はこの変数はコンピュータの中のあるところにしまわれていて、そのしまってある"住所"を持っています。これがアドレスです。

で、変数に & をつけるとそのアドレスを、ポインタに * を付けると、その住所の先の中身を表します。
つまり、1で
 int mydt=1234;
 int *pt;
 pt=&mydt;
とした結果、

mydt:変数mydtの中身(=1234)
&mydt:変数mydtのアドレス
pt:ポインタptの中身(=mydtのアドレス)
*pt:ポインタptの指す場所にあるもの(=mydtの中身=1234)

となります。

そして、3でエラーが出たのは、
"*pt=&mydt" で、ptの指す場所の「データ」にmydtの「アドレス」
を代入しようとしているからです。
正しくは、「ptの指す場所 = mydtのアドレス(1)」か、
「ptの指す場所の中身 = mydtの中身(2)」にしたいですよね。

5のエラーも同じで、アドレスの型にデータ型を代入しようとしているためのエラーです。

投稿日時 - 2009-02-06 19:55:25

お礼

>"3でエラーが出たのは、*pt=&mydt" で、ptの指す場所の「データ」
>にmydtの「アドレス」を代入しようとしているからです。
この記述納得できました。
ありがとうございます。

投稿日時 - 2009-02-07 02:19:33

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

>「int *pt=&mydt;」の記述は、ポインタptを宣言して変数mydtのアドレスを初期化し、「pt=&mydt;」と同様アドレスを代入しているという事でいいんですか?

変数mydtのアドレスを初期化、のくだりは不要です。
別に初期化をしているわけではありません。

int *型の変数ptを「定義」して、
そのptに、int型の変数mydtのアドレスを
代入しています。

>この記述もなんとなくですが、イメージできました。

何となく、のレベルにとどまっていると、
将来つまずいてしまいそうです。
人に説明できるレベルまで到達するよう、がんばってください。

投稿日時 - 2009-02-07 07:42:10

お礼

人に正確に説明が出来るようになれるよう頑張ります!
アドバイスありがとうございました。

投稿日時 - 2009-02-09 21:13:20

ANo.3

int* pt = &mydt;
と型の方に*つけた方が感覚的にはわかりやすいかもしれませんね。

ただ
int* p, q;
とするとpはポインタ型ですがqは普通のint型になるんですよね。

typedef int* PINT;
とすると
PINT p, q;
で両方ポインタ型になります。

投稿日時 - 2009-02-06 21:17:07

お礼

型の後に*を付けることも出来るとわかりました。
「typedef int* ~」とするとポインタの宣言が楽になり便利ですね。
ありがとうございます。

投稿日時 - 2009-02-07 02:23:37

ANo.1

問題点は 
「ポインタ変数として宣言する時に「*」をつけること」

「ソース内でポインタ変数に「*」をつけるとポインタ変数に書き込まれている値(アドレス)の内容を参照する」
を理解していないため。

>◎1と◎2の違い、
int *pt=&mydt;

int *pt;
pt=&mydt;
を一つにまとめたもの。変数の宣言と同時に初期値も入れている。

>後何故◎3はダメなのかがわかりません。
まず前提として、
int mydt=1234; のmydtは100番地
int *pt; のポインタ変数ptは200番地
にメモリがあるとする。

int *pt;
pt=&mydt;
はint型のポインタ変数で宣言された、ptの確保されたメモリ(100番地)にmydtの確保されたアドレス(200)を入れること。
従って、100番地に「200」という内容が記録されている。(200番地には「1234」が格納されている)
変数宣言後、ソース内でポインタ変数に対して「*」をつけた場合、
これは「ポインタ変数に格納されたいるアドレスの番地に確保されている内容」を表す。
質問の場合は「*pt」は200番地の内容なので「1234」となる。

ただ、そもそものエラーは「変数型が違う」ってところだから上記は全くの予断なんだけど。
「*pt」はint型ポインタの先にある内容なので「int型」
「&mydt」はmydtのアドレスなので「int型『ポインタ』型」
なので「型が違うから代入できない」というエラー

4、5も同じように、変数宣言と初期化を同時にやっているだけの違い。

投稿日時 - 2009-02-06 19:11:29

補足

度々すいません。
「int *pt=&mydt;」の記述は、ポインタptを宣言して変数mydtのアドレスを初期化し、「pt=&mydt;」と同様アドレスを代入しているという事でいいんですか?

投稿日時 - 2009-02-07 02:26:55

お礼

int *pt=&mydt;とすれば変数宣言とポインタの初期値が同時にできるとわかりました。
>「*pt」はint型ポインタの先にある内容なので「int型」
>「&mydt」はmydtのアドレスなので「int型『ポインタ』型」
>なので「型が違うから代入できない」
この記述もなんとなくですが、イメージできました。
ありがとうございます。

投稿日時 - 2009-02-07 02:01:15