ページ 11

ポインタの初歩

Posted: 2010年6月21日(月) 05:53
by Limone
すいません、ポインタについて教えて下さい

int _tmain(int argc, _TCHAR* argv[/url])
{
int a,*b;
a = 10;
*b = 0;
printf("値a:%d::::アドレスa:%d",a,&a);
printf("値b:%d::::アドレスb:%d",*b,b);
printf("\n");
return 0;
}

この実行結果でエラーが出ます
ポインタでエラーは出るんですが
何故エラーが出るのかが分からないのです

それと、配列やポインタ、クラスを作成した時は
削除する必要がある、と言われたのですがそれもイマイチ分かりません
レベルの低い理解度で申し訳ありませんがどうかお願いします

Re:ポインタの初歩

Posted: 2010年6月21日(月) 07:48
by シエル
この辺を参考になさった方がよいかと…
http://9cguide.appspot.com/15-05.html

>>それと、配列やポインタ、クラスを作成した時は削除する必要がある、
>と言われたのですがそれもイマイチ分かりません
メモリを動的確保した時のことですか?

Re:ポインタの初歩

Posted: 2010年6月21日(月) 12:14
by 初級者
bの値(つまり、どこを指しているかということ)が
不定の状態で、*bのように、その不定な場所にアクセスしてはいけません。

Re:ポインタの初歩

Posted: 2010年6月21日(月) 12:47
by Limone
>bの値(つまり、どこを指しているかということ)が
>不定の状態で、*bのように、その不定な場所にアクセスしてはいけません。

なるほど、分かったような気がします。
ありがとうございます

>>メモリを動的確保した時のことですか?

多分そうです。
しかし、動的確保と言うのが良く分かっていません
取り敢えず、以下ソース

void hantei(int *judge){
if (judge == NULL) {
printf("メモリの割り当て失敗\n");
} else {
printf("メモリの割り当て成功\n");
// メモリの解放どうやるの?
}
}

int _tmain(int argc, _TCHAR* argv[/url])
{
int a,*b=NULL;
hantei(b); //失敗の筈
b = &a; //bのアドレスにaのアドレスを設定
a = 10; //aの値に10を代入
*b = 100; //bの値に100を代入
printf("値a:%d::::アドレスa:%d\n",a,&a); //aとbのアドレスが一緒だからaの値は100になってる筈
printf("値b:%d::::アドレスb:%d\n",*b,b); //aとbのアドレスが一緒だからbの値は&aになってる筈
hantei(b);//成功の筈
return 0;
}

Re:ポインタの初歩

Posted: 2010年6月21日(月) 19:24
by シエル
上記のソースがメモリの動的確保をしているとは思えませんが…

Re:ポインタの初歩

Posted: 2010年6月21日(月) 19:55
by Limone
どうやら言葉が足りなかったようです。

動的確保と言うのが良く分かっていません
動的確保とは何ですか、どうすれば動的確保なんですか
↑のソースで作ってみましたが、コレは違うんですよね?
じゃあ、やっぱり
動的確保とは何ですか、どうすれば動的確保なんですか
となるワケです

その問いに対して
動的確保しているとは思えません、と答えられましても
私には分かりかねます

それと、動的確保じゃなければ解放処理はしなくても良いんですか

Re:ポインタの初歩

Posted: 2010年6月21日(月) 20:47
by シエル
どの辺までC言語を勉強されてるのか分かりませんが、
この辺を参考になさって下さい。
http://www.geocities.jp/ky_webid/c/055.html

>それと、動的確保じゃなければ解放処理はしなくても良いんですか
動的に確保していなければ、その関数が終了した時点で自動的に解放されます。

追記:
c++のクラスについてはこちら
http://www.geocities.jp/ky_webid/cpp/language/012.html
少しはググってみて自分で調べてみましょう。 画像

Re:ポインタの初歩

Posted: 2010年6月21日(月) 21:12
by Limone
すいません
ググった結果、辿り着いたココの
C言語何でも質問掲示板で
ググって自分で調べろ、と言われると思っていませんでした

どうやらココの掲示板は私にはレベルが高過ぎるようです
よろしければ、低レベルの理解度な初心者が
質問しても大丈夫な掲示板などがあれば教えて下さい

Re:ポインタの初歩

Posted: 2010年6月21日(月) 21:22
by MNS
「動的確保とはなんですか?」
このような漠然とした質問の場合、
基本的には、サイト上での詳しい説明よりもわかりやすく、
このような掲示板のスレッド上で説明することは困難です。当たり前ですね。
それはどこの掲示板を行っても同じだと思いますよ。

Limoneさんが、シエルさんが提示されたサイトを読んでみて、わからなかったのなら、
何が分からなかったを具体的に明らかにして質問してみてください。
そうすれば、回答者の方々は、その分からなかったところを重点的に詳しく説明することが出来ます。
そういうところが、いわゆる掲示板のメリットなのではないでしょうか?

Re:ポインタの初歩

Posted: 2010年6月21日(月) 22:03
by ookami
例えばいきなり「日本とは何ですか?」とか聞かれたら、「何って何が?」と思うと思います。質問が曖昧とはそんな感じです。

さらに「日本で芸者は富士山でリニアモーターカーですか?」とか聞かれたら「いやちょっと勘違いしてるみたいだから、とりあえずガイドブックでも読んでみたら?」と思うと思います。今そんな感じです。

レベルの高い低いではなくて、いったん情報を整理してみましょう、ということです。

Re:ポインタの初歩

Posted: 2010年6月21日(月) 22:04
by Limone
その質問をした結果、その提示サイトへと答えて貰えて
提示サイトを読んで試した結果、なんとなくわかったのですが

そもそも、その質問をするな、と言われたら
そういった「サイトの行き方へと教えていただくこと」すらもできません。

どうやら、既存サイトへの誘導レベルでしか無い質問だと
ここではダメな様子を受けましたので。
ですので、次回以降は手を煩わせ無いように
そういったサイト誘導レベルの質問をしても大丈夫な掲示板があれば、と思ったのです

Re:ポインタの初歩

Posted: 2010年6月21日(月) 22:07
by box
> それと、配列やポインタ、クラスを作成した時は
> 削除する必要がある、と言われたのですがそれもイマイチ分かりません

そのように言った人自身が、イマイチわかっていないだけだと思います。

Re:ポインタの初歩

Posted: 2010年6月21日(月) 22:39
by y
もしかして、勉強は嫌い(または苦手)な方でしょうか。

>そういった「サイトの行き方へと教えていただくこと」すらもできません。
ということを調べるのが、ググるということです。

>そういったサイト誘導レベルの質問をしても大丈夫な掲示板があれば、と思ったのです
もし紹介したら、今度はその掲示板の方々の手を煩わすことになります。


みんな始めはわからないものです。
それでも入門書なり入門サイトなりに目を通し、実行させながらなんとか理解するのです。
それが勉強というものではないでしょうか。
私は、勉強してある程度理解して、疑問が生まれ、そこではじめて質問するに至るものだと思っています。
貴方はまだその域に達していません。単なる勉強不足です。

少々キツイ言い方になってしまいましたが、今後の貴方のためを思い、敢えて言わせて頂きました。
どうかお許しください。

Re:ポインタの初歩

Posted: 2010年6月21日(月) 22:49
by MNS
Limoneさんが、最初に質問された、
「なんでこのコードではエラーがでるの?」という質問は、調べるのは難しいでしょうね。
難しいなりに調べてみて、この掲示板にたどり着いたんだと思います。

そして、質問した結果、『動的確保』というキーワードを得ましたね。
これをオウム返しのように、「動的確保とは?」と返すのは良くないのです。
この動的確保というキーワードを調べてみましたか?

>そもそも、その質問をするな、と言われたら
>そういった「サイトの行き方へと教えていただくこと」すらもできません。

シエルさんが提示されたサイト(前者)は、動的確保とGoogleで調べれば、2番目に出てきます。
Limoneさんが、このサイトを読んで試した結果、分かったのなら、
わざわざ質問するよりも、自分で調べてみたほうが早いとは思いませんか?

Re:ポインタの初歩

Posted: 2010年6月21日(月) 22:58
by Limone
はい、そうですね
検索の仕方が間違ってました
すいませんでした

Re:ポインタの初歩

Posted: 2010年6月21日(月) 23:01
by ムンバ
こんばんは。

いつも変で、すみません。(汗
スレッドから離れてしまいます事、どうかお許し下さい。

私は「ググってみましょう」とか「グーグル先生に聞いてみましょう」
など、ご指導していらっしゃった方々の「ググる」って意味は
(yさんのNo:55027でおっしゃられてる「ググる」の揚げ足とかを取っているのでは無いので
 お気に触られたら、どうかご勘弁下さい。悪意等は全く御座いませんので。)

「Googleサイトの検索エンジンで、検索してみましょう。」
って意味かと、今まで思っていたのですが
「Yahooのサイトの検索エンジンで、検索してみましょう。」
も、ググるって事なのですか?

またしても、変な質問∩便乗させて頂き、すみません。(_ _)
ご指導頂ける方、宜しくお願い致します。

---編集・追加---
新しく、スレッド立てるべきでした。
解決後に、すみませんでした。(謝
必要なら、また質問させて頂きますので
今回の私のぶら下がり、無視して下さい。
本当に、すみませんでした。 画像

Re:ポインタの初歩

Posted: 2010年6月21日(月) 23:08
by dic
動的確保とはプログラム実行中にメモリを割り当てることです
今回のソースコードでは、ソースコードに書いた時点で割り当てられており
プログラムが実行し、そのプログラムがメモリを必要としているので
そのプログラムが必要に応じてメモリを確保するという意味です

動的メモリ確保の対義語として、静的メモリの確保というものがあります

この静的メモリ確保は、ソースコードを書いた時点で、どれだけのメモリを確保するのか
ソースコードにそのまま書かれています

動的メモリ確保は、プログラムを実行した時にメモリの確保をします
場合によっては100Kbかもしれませんし、100MBだったりします
これは、ソースコードに直接書き込むことができません
そのプログラムが必要とした、プログラムの実行中にしか分からないメモリのことを指しています

Limoneさんが言っているのは動的メモリの確保ではなく、静的メモリの確保です
静的メモリの確保は初めからどのくらいのメモリを必要とするか分かっており、
ソースコードに直接書き込めるものです

int i; も
int *p; も
メモリを確保するという点では同じです
ただ、この *p にどのくらいのメモリを入れるかを
コンパイルの時ではなく、プログラム実行中に決めるのは動的メモリの確保です

動的、静的の違いを比べてみるのがいいかと思います

Re:ポインタの初歩

Posted: 2010年6月21日(月) 23:09
by ookami
この掲示板ほど、専門知識をもっていて良心的な回答者さんが集まる掲示板はなかなか無いと思います。

Limoneさんは引きぎみのようですが… 決して、怒ったりけなしたりしているわけではないんですよ。

> ムンバさん
「ググる」そのものは「グーグルで検索する」という意味のようです。「検索といえばグーグル」みたいな風潮になってるからですかね^^

Re:ポインタの初歩

Posted: 2010年6月21日(月) 23:10
by Poco
> そもそも、その質問をするな、と言われたら
> そういった「サイトの行き方へと教えていただくこと」すらもできません。

誰も「質問するな」って言ってませんよ。
シエルさんの
> 少しはググってみて自分で調べてみましょう。
は「くだらない質問するな」って意図ではなくて、
「そういう癖をつけると時間の節約になります」って意図だと思いますよ。

#言葉足らずな点は否めませんが。

Re:ポインタの初歩

Posted: 2010年6月21日(月) 23:13
by ムンバ
(ookamiさん、ご解説ありがとう御座いました。了解しました。^^)

Re:ポインタの初歩

Posted: 2010年6月22日(火) 02:30
by Limone
意見、解答、フォローありがとうございます。
既に解決済みマークを付けましたが
ちゃんと読みましたよ、理解しました(つもりですよ)
という印として書き込ませて頂きます。

追記:
お礼は答えてくれた方全員に大してすべきで、
個別にはあまりしたくは無いのですが、それでも
「dic」さん ありがとうございます 画像