ポインタを理解する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たいちう
記事: 418
登録日時: 9年前

Re: ポインタを理解する

#61

投稿記事 by たいちう » 6年前

元々のスレの趣旨は、こうですよね。

> と理解が曖昧です。このトピックでポインタを克服したいと思います。

何故ポインタを克服したいのかは書いていませんが、
上達したい、壁を超えたい、というのが目的ですよね?
前スレのテーマもオブジェクト指向でしたし。

私も「パターンとして覚える」というのは理解の放棄(延期)でしかないと思います。
また暫くしたら、似たようなスレを立てることになりそうじゃないですか?


3D_3Dさんは高校生のようですので、「ポインタ」を「微積分」に置き換えて考えてみましょう。
(私が高校生だったのも大昔だし、例えが変かもしれません)
パターンを覚えて数学の実力がアップすると思いますか?
逆に、理解なしで実力をアップさせるには、微積分のパターンをどれだけ覚えたらよいと思いますか?

JavaやC#ならポインタは無いので、言語を変更することで当面の問題はなくなります。
文系の大学を目指すことで微積分が必要無くなるようなものです。
ただ、JavaやC#でプログラミングをしても、ポインタ程度に理解しにくい概念は何度でも出てくるでしょう。
例えば、オブジェクト指向を使いこなすことは、ポインタを使いこなすよりもよほど難しいと思います。


このような本でじっくり勉強してはどうでしょうか?
C言語ポインタ完全制覇(当時は良い本だと思った)
詳解C言語 ポインタ完全攻略(読んだことない)
オフトピック
JavaやC#や文系大学をけなす意図は一切ありませんよ。念のため。

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#62

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:疑問に疑問で返しますが、どうなんでしょうか?
パターン暗記法の効能がよく分かっていない私です。
ポインタを理解しないでプログラムが書けるから初心者の鬼門などと言われるポインタを意識しなくていい、などでしょうか?
オフトピック
実際、鬼門と呼ばれているかは知りませんが。
初心者です

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#63

投稿記事 by Rittai_3D » 6年前

>>へにっくす様

返信ありがとうございます。
へにっくす さんが書きました:
3D_3D さんが書きました:それでは、その都度聞くのはダメでしょうか?
それがパターンを覚えるってことだと思いますけど。
だから、結果優先でやるということは、思い通りの結果を得るまで試行錯誤することになる、と言いました。

なのでこのトピックの主旨から外れると思いますので、ここはいったん解決にした方がいいかもしれません。
【追記】私が言うことではない気がしたので、上の文言は取り消します。。
なんだかんだで試行錯誤することが一番の近道みたいですね。早速明日からやってみたいと思います
初心者です

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#64

投稿記事 by Rittai_3D » 6年前

>>たいちう様

返信ありがとうございます。
たいちう さんが書きました:元々のスレの趣旨は、こうですよね。

> と理解が曖昧です。このトピックでポインタを克服したいと思います。

何故ポインタを克服したいのかは書いていませんが、
上達したい、壁を超えたい、というのが目的ですよね?
前スレのテーマもオブジェクト指向でしたし。

私も「パターンとして覚える」というのは理解の放棄(延期)でしかないと思います。
また暫くしたら、似たようなスレを立てることになりそうじゃないですか?
3D_3Dさんは高校生のようですので、「ポインタ」を「微積分」に置き換えて考えてみましょう。
(私が高校生だったのも大昔だし、例えが変かもしれません)
パターンを覚えて数学の実力がアップすると思いますか?
逆に、理解なしで実力をアップさせるには、微積分のパターンをどれだけ覚えたらよいと思いますか?

JavaやC#ならポインタは無いので、言語を変更することで当面の問題はなくなります。
文系の大学を目指すことで微積分が必要無くなるようなものです。
ただ、JavaやC#でプログラミングをしても、ポインタ程度に理解しにくい概念は何度でも出てくるでしょう。
例えば、オブジェクト指向を使いこなすことは、ポインタを使いこなすよりもよほど難しいと思います。


このような本でじっくり勉強してはどうでしょうか?
C言語ポインタ完全制覇(当時は良い本だと思った)
詳解C言語 ポインタ完全攻略(読んだことない)
オフトピック
JavaやC#や文系大学をけなす意図は一切ありませんよ。念のため。
まだ微積分は習ってないので、別の物に脳内変換して考えました。
たしかに、パターンを覚えただけでは実力アップは出来ないですね。やはり理解しないと実力アップは望めないのですね。

JavaやC# はポインタが無いのには驚きです。どの言語にもあると思っていたので。
初心者です

たいちう
記事: 418
登録日時: 9年前

Re: ポインタを理解する

#65

投稿記事 by たいちう » 6年前

既に注意されているのかもしれませんが、全文引用は控えて下さい。
必要な部分のみの引用にして下さい。スレが無駄に長くなり読みにくくなります。
それと、まとめてレスを付けても良いのですよ。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#66

投稿記事 by softya(ソフト屋) » 6年前

また、みんなが色々言うと混乱するかもしれませんが、これを試してみませんか?
「Visualization C Interpreterのダウンロード : Vector ソフトを探す!」
http://www.vector.co.jp/soft/dl/win95/p ... 42764.html
バグが多いので、迂闊なことするとすぐ落ちますが簡単なプログラムなら通ると思います。
C言語の動作を映像的に表示しながら実行します。

自分でコードを書いて納得できるまで色々試してみてはどうでしょうか?
とりあえずのサンプル。付属のサンプルが難しそうだったので。

コード:

#include<stdio.h>
main(){
 int *p;
 int a;
 int b;
 p=&a;
 *p = 1;
 p=&b;
 *p = 2;
 printf("%d,%d",a,b);
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

かずま

Re: ポインタを理解する

#67

投稿記事 by かずま » 6年前

softya(ソフト屋) さんが書きました:また、みんなが色々言うと混乱するかもしれませんが、これを試してみませんか?
「Visualization C Interpreterのダウンロード : Vector ソフトを探す!」
わざわざ、そんなソフトをインストールする必要はないと思います。
次の図で理解できなければ、何をやっても無駄な気がします。

コード:

int *p;
  +----------+
p |  (int *) }
  +----------+

int a;
  +----------+       +-----------+ 
p |  (int *) |     a |   (int)   |
  +----------+       +-----------+ 

int b:
  +----------+       +-----------+         +-----------+
p |  (int *) |     a |   (int)   |       b |   (int)   |
  +----------+       +-----------+         +-----------+

p = &a;
  +----------+       +-----------+         +-----------+
p |   &a  *------> a |   (int)   |       b |   (int)   |
  +----------+       +-----------+         +-----------+

*p = 1;
  +----------+       +-----------+         +-----------+
p |   &a  *------> a |     1     |       b |   (int)   |
  +----------+       +-----------+         +-----------+

p = &b;         +-------------------+
  +----------+  |    +-----------+  |      +-----------+
p |   &b  *-----+  a |     1     |  +--> b |   (int)   |
  +----------+       +-----------+         +-----------+

*p = 2;         +-------------------+
  +----------+  |    +-----------+  |      +-----------+
p |   &b  *-----+  a |     1     |  +--> b |     2     |
  +----------+       +-----------+         +-----------+

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: ポインタを理解する

#68

投稿記事 by へにっくす » 6年前

3D_3D さんが書きました:なんだかんだで試行錯誤することが一番の近道みたいですね。早速明日からやってみたいと思います
#私の後のISLeさんへのレスが無いみたいなので。
ISLeさんが基本パターンを挙げられているので、頭に入れておいた方がよいですよ。
written by へにっくす

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#69

投稿記事 by softya(ソフト屋) » 6年前

と、また3D_3Dさんが混乱しそうなので3D_3Dさんにどうするか決めて頂くまで、一旦だまります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#70

投稿記事 by Rittai_3D » 6年前

すいません、夏風邪を引いたようで返信が出来ませんでした。

>>たいちう様

返信ありがとうございます。

>既に注意されているのかもしれませんが、全文引用は控えて下さい。
>必要な部分のみの引用にして下さい。スレが無駄に長くなり読みにくくなります。

すいません、以後気をつけます。
オフトピック
この位なら大丈夫ですよね?一応確認しておきたくて。
>>softya様

返信ありがとうございます。

>また、みんなが色々言うと混乱するかもしれませんが、これを試してみませんか?
>「Visualization C Interpreterのダウンロード : Vector ソフトを探す!」

すいません、現在親のPCを借りてプログラムを書いているので、あまりいじりすぎると怒られてしまうので、自分のPCが使えるようになったら試してみたいと思います。

>>かずま様

返信ありがとうございます。
かずま さんが書きました:

コード:

int *p;
  +----------+
p |  (int *) }
  +----------+
 
int a;
  +----------+       +-----------+ 
p |  (int *) |     a |   (int)   |
  +----------+       +-----------+ 
 
int b:
  +----------+       +-----------+         +-----------+
p |  (int *) |     a |   (int)   |       b |   (int)   |
  +----------+       +-----------+         +-----------+
 
p = &a;
  +----------+       +-----------+         +-----------+
p |   &a  *------> a |   (int)   |       b |   (int)   |
  +----------+       +-----------+         +-----------+
 
*p = 1;
  +----------+       +-----------+         +-----------+
p |   &a  *------> a |     1     |       b |   (int)   |
  +----------+       +-----------+         +-----------+
 
p = &b;         +-------------------+
  +----------+  |    +-----------+  |      +-----------+
p |   &b  *-----+  a |     1     |  +--> b |   (int)   |
  +----------+       +-----------+         +-----------+
 
*p = 2;         +-------------------+
  +----------+  |    +-----------+  |      +-----------+
p |   &b  *-----+  a |     1     |  +--> b |     2     |
  +----------+       +-----------+         +-----------+
ちょっと不安ですがなんとなくならわかります。p = &a がちょっと???状態です。
オフトピック
以降、返信は大体3人ずつ位で区切ります。
初心者です

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#71

投稿記事 by Rittai_3D » 6年前

>>へにっくす様

返信ありがとうございます。
へにっくす さんが書きました: #私の後のISLeさんへのレスが無いみたいなので。
ISLeさんが基本パターンを挙げられているので、頭に入れておいた方がよいですよ。
すいません、ISLe様のレスを見落としていました。頭に入れておきます。

>>ISLe様

返信ありがとうございます。また、返信が遅れてしまい申し訳ありません。
ISLe さんが書きました:パターンで覚えるというのは、ポインタを要求されたときに答える形になるので、どんなときに使うかを考える必要はありません。
なので、パターンで覚えることができても、自ら積極的にポインタを使うことにはほとんど貢献しません。
なるほど。ただ、自分の様な初心者が無闇にポインタは使わない方が良いと思うので、ポインタが理解できない初心者にはいいと思います。
ISLe さんが書きました: アドレス演算子(&)を付けると型に*が1個増える
間接演算子(*)を付けると型から*が1個減る
*の数を揃えて使う
を頭に入れてしまいます。
初心者です

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#72

投稿記事 by Rittai_3D » 6年前

考えがコロコロ変わってしまいますが、たいちう様の

>「パターンとして覚える」というのは理解の放棄(延期)でしかないと思います。

で、やはりパターンではなく、ポインタを理解しようと考えました。

自分は、ソースコード中にポインタが出たときに「なぜここでポインタを使うのか?」で詰まってしまいます。

例えば、龍神録プログラミングの館のここ

コード:

//引数1と引数2のうち大きい方を引数1に代入する
void input_pad_or_key(int *p, int k){
        *p = *p>k ? *p : k;
}
で何故ポインタを引数に?で今は詰まります。( 最初の頃はそういうもの で誤魔化してました )
オフトピック
自分はそこさえ分かれば理解出来そうな気がします、と考えました
初心者です

アバター
Tatu
記事: 440
登録日時: 8年前
住所: 北海道

Re: ポインタを理解する

#73

投稿記事 by Tatu » 6年前

pを書き換えたいからポインタを使用しているのではないでしょうか?

それとも

コード:

int input_pad_or_key(int p,int k){
	return p>k ? p :k;
}

pad=input_pad_or_key(pad,key);
でもいいんじゃないかということですか?

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#74

投稿記事 by Rittai_3D » 6年前

>>Tatu様

返信ありがとうございます。

>pを書き換えたいからポインタを使用しているのではないでしょうか?

書き換えるのにポインタを使う必要が分からないです。
Tatu さんが書きました:

コード:

int input_pad_or_key(int p,int k){
	return p>k ? p :k;
}
pad=input_pad_or_key(pad,key);
でもいいのでは?ということです。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#75

投稿記事 by softya(ソフト屋) » 6年前

別にTaruさんの方法でも問題がないなら構わないんですよ。人により、
(1) *p = *p>k ? *p : k;
(2) return p>k ? p :k;
(1)と(2)のどちらが素直か意見が別れそうですが。

そうですね。同じ動作であるということは理解されていますよね。
(1)と(2)のそれぞれの動作を説明してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#76

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。

>(1) *p = *p>k ? *p : k;
>(2) return p>k ? p :k;
>(1)と(2)のそれぞれの動作を説明してみてください。

(1)がわかりません。*pに*pかkの大きい方を代入する?ですか?
(2)はpとkで大きい方を返す

でしょうかね。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#77

投稿記事 by softya(ソフト屋) » 6年前

そうですね。
じゃあ、(1)の*pと(2)のpって何が違うんでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

かずま

Re: ポインタを理解する

#78

投稿記事 by かずま » 6年前

ポインタを使う方の関数の呼び出し

コード:

    input_pad_or_key(&pad.key[configpad.left], CheckStateKey(KEY_INPUT_LEFT));
ポインタを使わない方の関数の呼び出し

コード:

    pad.key[configpad.left] = input_pad_or_key(pad.key[configpad.left], CheckStateKey(KEY_INPUT_LEFT));
どっちの方がいいですか?

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#79

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。

>(1)の*pと(2)のpって何が違うんでしょうか?

(1)はパッドの番号のポインタ?よくわかりません。

(2)はパッドの番号を表す、でしょうか?

>>かずま様

返信ありがとうございます。

>ポインタを使う方の関数の呼び出し
>input_pad_or_key(&pad.key[configpad.left], CheckStateKey(KEY_INPUT_LEFT));
>ポインタを使わない方の関数の呼び出し
>pad.key[configpad.left]=input_pad_or_key(pad.key[configpad.left],CheckStateKey(KEY_INPUT_LEFT));
>どっちの方がいいですか?

ポインタの方がわかりやすく、楽に書けるということでしょうか?
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#80

投稿記事 by softya(ソフト屋) » 6年前

「パッドの番号」って事はコード自体が理解できていない気がして来ましたが保留しておきますか? 本筋と違うんですが大きく間違っています。
つまり、ポインタの前にこのコードの機能自体を把握できていないって事ですけど。

コード:

//引数1と引数2のうち大きい方を引数1に代入する
void input_pad_or_key(int *p, int k){
        *p = *p>k ? *p : k;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

かずま

Re: ポインタを理解する

#81

投稿記事 by かずま » 6年前

3D_3D さんが書きました: ポインタの方がわかりやすく、楽に書けるということでしょうか?
違います。

関数を呼び出すというのは、ある処理を任せる、仕事を委託するということです。

ポインタを使った関数 input_pad_or_key は、「ある変数の値と、もう一つの値を比較
して、大きいほうの値を最初の変数に代入する」という仕事をやり遂げることができます。

ところが、ポインタを使わないほうの関数は、「ある値と、もう一つの値を比較して
大きいほうを返す」という仕事しかしていません。
関数の呼び出し側、すなわち仕事を委託したほうは、返された値を、最初の値を
持っていた変数に代入するという仕事を自分でやらなければなりません。

せっかく関数を用意して、仕事をやってもらうんだったら、代入操作もその関数に
やってもらいたいですよね。

ポインタを使わないと、関数は引数として「値」しかもらえませんから、それらを
比較して大きいほうの値がわかっても、それをどの「変数」に代入すれば
いいのか分かりません。
関数の中の p は、
呼び出し側の pad.key[configpad.left] という変数の「値」であって、
pad.key[configpad.left] という「変数」ではありません。

ポインタを使ったほうの関数は、最初の変数の場所をもらっているので、そこから
値を読みだすこともできるし、比較結果の大きいほうの値をその変数に代入すること
ができます。
関数の中の *p は
呼び出し側の pad.key[configpad.left] という変数そのものなのです。

input_pad_or_key(&pad.key[configpad.left], CheckStateKey(KEY_INPUT_LEFT));
という呼び出しの &pad.key[configpad.left] は
pad.key[configpad.left] という変数の場所(アドレス) をポインタとして
input_pad_or_key に渡しています。

一方
pad.key[configpad.left] = input_pad_or_key(pad.key[configpad.left], CheckStateKey(KEY_INPUT_LEFT));
という呼び出しの pad.key[configpad.left] は
pad.key[configpad.left] という変数の値を int として
input_pad_or_key に渡しています。

ポインタが何のためにあるのか、これでもわかりませんか?

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#82

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。

>「パッドの番号」って事はコード自体が理解できていない気がして来ましたが保留しておきますか? 本筋と違うんですが大きく間違っています。
>つまり、ポインタの前にこのコードの機能自体を把握できていないって事ですけど。

何か勘違いしていたようです。もう一度書きます。

(1)パッドかキーボードの入力されているパッドのアドレスかキーコードを返す?#追記 返す ではなく、 *pに代入 です。
(2)パッドかキーボードの入力されているキーの値?を返す?

でしょうか?

>>かずま様

返信ありがとうございます。

>ポインタを使ったほうの関数は、最初の変数の場所をもらっているので、そこから
値を読みだすこともできるし、比較結果の大きいほうの値をその変数に代入すること
ができます。
>関数の中の *p は
>呼び出し側の pad.key[configpad.left] という変数そのものなのです。

そのような意味だったのですか!理解できました。ポインタが如何に便利かわかりました。

つまり、「pのアドレスにpad.key[configpad.left]のアドレスかキーコードを渡す」ということですか?文章力がなくて何を言っているかわからないと思いますが、何とか理解出来たと思います。少し不安ですが。
最後に編集したユーザー Rittai_3D on 2013年8月16日(金) 00:40 [ 編集 1 回目 ]
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#83

投稿記事 by softya(ソフト屋) » 6年前

> (1)パッドかキーボードの入力されているパッドのアドレスかキーコードを返す?
> (2)パッドかキーボードの入力されているキーの値?を返す?
それも違いますね。キーの値でもないですし、キーコードでもないです。ましてやアドレスでもありません。
pad.key[configpad.left]に入っている値そのものを分かっていない感じです。
それと(1)と(2)はある一点を除いては同じ動作をするので、アドレスなんて言葉は出てこないです。
かずまさんの説明を理解しているなら書けるはずなんですよ。

> つまり、「pのアドレスにpad.key[configpad.left]のアドレスかキーコードを渡す」ということですか?
これも不安ですね。アドレスかキーコードだと2つはだいぶ違うものです。

【補足】
なんだろうシンプルな話なのに、逆に複雑に考えてしまっている気がしてなりません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 522
登録日時: 6年前

Re: ポインタを理解する

#84

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。

>それも違いますね。キーの値でもないですし、キーコードでもないです。ましてやアドレスでもありません。
>pad.key[configpad.left]に入っている値そのものを分かっていない感じです。
>それと(1)と(2)はある一点を除いては同じ動作をするので、アドレスなんて言葉は出てこないです。

値を返すかpのポインタに代入するか、ですか?

>かずまさんの説明を理解しているなら書けるはずなんですよ。

自分の文章力が乏しいため上手くかけません。頭の中ではこういうことか!とわかったつもりでも、いい言葉が思いつかないというか、何というか…

>なんだろうシンプルな話なのに、逆に複雑に考えてしまっている気がしてなりません

まさにその通りです。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ポインタを理解する

#85

投稿記事 by softya(ソフト屋) » 6年前

例えを思いついたので、書いてみます。
ルール。[誤解を生みそうなので修正]
・箱が3つあります。
・箱には、それぞれ1と2と3と言う番号が書いてあります。
・箱には数字を書いた紙を入れられます。
・箱にはラベルに英数字で名前を付けられます。
・箱には数値型とポインタ型と言う属性札が付けれます。
・ポインタ型は箱に入れらた紙に書かれた数値の番号の箱を参照できるようになります。これを間接参照と呼びます。
例として間接参照でポインタ属性の箱を覗くと2と書かれた紙が入っていたら、箱2を使えって意味となります。

作業。
・箱1にaと言う名前をつけました。属性は数値型です。
・紙に5と書いて箱aに入れました。
・箱2にbと言う名前をつけました。属性は数値型です。
・紙に13と書いて箱bに入れました。
・箱3にpと言う名前をつけました。属性はポインタ型です。
・紙に1と書いて箱pに入れました。

質問。
・上記の作業後に箱pを間接参照した場合には、なんて書かれた紙を取り出すことに成るでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

どぶろく
記事: 75
登録日時: 7年前

Re: ポインタを理解する

#86

投稿記事 by どぶろく » 6年前

softya様、いつもおせわになっております。
横から口をはさんで申し訳ないのですが、私の考えでは、

int* b;

という宣言があったら2つの変数が宣言されたと考えます。

b // アドレスを入れる変数
*b // 普通のint型の変数

ただし普通の変数である *b にはまだ領域が確保されていません。
なので b に他で確保されている領域のアドレスを代入する必要があります。
b にアドレスが代入されると、その領域を *b として使うことができます。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: ポインタを理解する

#87

投稿記事 by ISLe » 6年前

文章力が無いのならなおさら、文章自体を省略せずに書くべきだと思います。
誰も、簡潔に著せ、とは書いてないですよね。

コード:

void input_pad_or_key(int *p, int k){
        *p = *p>k ? *p : k;
}
上記の場合、intへのポインタ型の変数pに格納されたアドレスが指す記憶域に代入してます。

コード:

int input_pad_or_key(int p,int k){
    p = p>k ? p :k;
    return p;
}
上記の場合、int型の変数pの記憶域に代入してます。

3D_3Dさんの日記のコメントに、繰り返し唱えてって書いたことですけど、もう唱えるのやめてしまったのでしょうか。

たいちう
記事: 418
登録日時: 9年前

Re: ポインタを理解する

#88

投稿記事 by たいちう » 6年前

> 文章力が無いのならなおさら、文章自体を省略せずに書くべきだと思います。
> 誰も、簡潔に著せ、とは書いてないですよね。

文章力≒理解力なんですよね。
文章力を鍛えたら、理解力も向上しますよ。
上手く説明できないことは理解していないものと認識してください。
安易に理解したつもりにならないように。

一応ここでいう文章力は、文学作品やベストセラーを書けるような能力ではなく、
書き手の伝えたいことが読み手に伝わるような文章を書ける能力です。
文学的ではなく論理的な文章ですね。

かずま

Re: ポインタを理解する

#89

投稿記事 by かずま » 6年前

文章が書けなくても図は描けるようになりましたか?

次のプログラムで、*q = x - y; を実行した後のすべての変数
(main の a, b, c, d と sum_diff の x, y, p, r) の関係を
図に書いてみてください。

コード:

#include <stdio.h>

void sum_diff(int x, int y, int *p, int *q)
{
    *p = x + y;
    *q = x - y;
}

int main(void)
{
    int a = 23, b = 45, c, d;
    sum_diff(a, b, &c, &d);
    printf("a + b = %d\n", c);
    printf("a - b = %d\n", d);
    return 0;
}
実行結果

コード:

a + b = 68
a - b = -22

かずま

Re: ポインタを理解する

#90

投稿記事 by かずま » 6年前

どぶろく さんが書きました: int* b;

という宣言があったら2つの変数が宣言されたと考えます。

b // アドレスを入れる変数
*b // 普通のint型の変数

ただし普通の変数である *b にはまだ領域が確保されていません。
なので b に他で確保されている領域のアドレスを代入する必要があります。
b にアドレスが代入されると、その領域を *b として使うことができます。
int *b;
b = malloc(sizeof(int) * 3);

b にアドレスが代入され、
*b は b[0] として使うとことができますが、
*(b+1) すなわち b[1]、*(b+2) すわなち b[2] も使えます。
ということは、b と合わせて 4つの変数が「宣言された」
と考えるのですか?

閉鎖

“C言語何でも質問掲示板” へ戻る