• ベストアンサー

C言語のポインタとスタックポインタ

プログラム始めて1ヶ月の初心者です。 C言語のポインタとスタックポインタというのは同じなのでしょうか。 スタックポインタの考えは大体理解出来たのですが C言語のポインタとなるとコードを見てもサッパリ分かりません。 ネットで調べても出てこなかったのでどなたか教えて下さい。 よろしくお願いします。

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★紹介 ・スタック・ポインタを理解するにはスタックの動きをお勉強して下さい。  下にアセンブラ入門のサイトを紹介します。  C言語のポインタを学習するのに一番の近道はメモリ・イメージを  紙などに描きアドレスを考えることです。  また、アセンブラをちょっとお勉強すればポインタの理解も早いかもしれない。 ・ちなみにポインタを簡単に説明するとデータ型とアドレスの2つの情報を持つもの。  例えばアセンブラでアドレスが0x1000のとき  アドレスに+1すると0x1001になります。  ポインタに+1するとデータ型によって加算される値が変わります。  つまり  char *pc→char型は1バイトなので0x1001となる  long *pl→long型は4バイトなので0x1004となる  double *pd→double型は8バイトなので0x1008となる  このようにポインタはデータ型により+1した時にアドレスに加算される値が異なります。  ※通常はポインタのアドレス値を考えなくて良い。アセンブラではないので。 参考サイト: http://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.html http://www5c.biglobe.ne.jp/~ecb/assembler/4_7.html http://www5c.biglobe.ne.jp/~ecb/assembler/4_8.html

shutalui77
質問者

お礼

ありがとうございます。 とても分かりやすかったです。参考サイトよく見てみます。

その他の回答 (5)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.5

>C言語のポインタとスタックポインタというのは同じなのでしょうか。 違うものです。 >スタックポインタの考えは大体理解出来たのですが >C言語のポインタとなるとコードを見てもサッパリ分かりません。 違うものなので、サッパリ分からなくても当然です。 >ネットで調べても出てこなかったのでどなたか教えて下さい。 普通は比較する対象ではないので、ネットで調べても出てこないでしょうね。 でも、「メモリのどこかを指す」という点はいっしょなので、スタックポインタが本当に理解できているのなら、ポインタの理解もたやすいと思いますよ。

shutalui77
質問者

お礼

そうなんですか。ありがとうございました。 引き続きポインタの勉強に励むことにします。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★補足要求します。  スタックポインタとは  1...C言語でスタック・データ構造を組んでPush、Popのポインタを意味するのか?  2...CPUプロセッサのレジスタの1つにあるスタック・ポインタ(sp)を意味するのか?  どちらですか?  ここがハッキリしないと誰も適切な回答が出来ません。  ソースなども含めて補足して下さい。

shutalui77
質問者

補足

言葉足らずですみませんでした。 私が言おうとしていたのは >2...CPUプロセッサのレジスタの1つにあるスタック・ポインタ(sp)を意味するのか? のことです。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.3

> スタックポインタの考えは大体理解出来たのですが プロセッサのレジスタの一つですね。 > C言語のポインタ C言語の中のポインタ型の変数です。 土俵が違うし、そのポインタと言う言葉自体、直接的には別のものを指します。 辿り辿って行けば同じものである場合もありますが、質問文の書き方では別物です。

shutalui77
質問者

お礼

普通はそんなに辿るものではないですよね。 ありがとうございました。

  • gatyan
  • ベストアンサー率41% (160/385)
回答No.2

別物です、たぶん スタックというデータ構造がありますが、その説明の部分で出てきていて、データの読み書きにstack[sp]の様に配列を使うなら、スタックポインタとは呼ばれますが int や long など整数型の変数になります ポインタの練習を兼ねているような場合は、ややこしいですが…C言語のポインタということになります *spでスタック上のデータにアクセスしてsp++やsp--でPush/Popを実現しているとか 関数の呼び出しや、変数がどのように管理されるかのような部分で出てきたのなら、CPUのデータ管理の仕組み・スタックを管理するためのもの(レジスタ)を意味します

shutalui77
質問者

お礼

どう違うのかが分かりました。詳しく説明して頂きありがとうございました。

  • auty
  • ベストアンサー率58% (284/486)
回答No.1

・ 「ポイント」と言うのは、「指す」ということです。 ・ C言語の「ポインタ」と言うのは、普通、[メモリのアドレス]を指します。 ・ 「スタックポインタ」と言うのは、スタックの特定位置を「指す物」ということですね。 ・ C言語の「ポインタ」は、「物理」なメモリを意識する必要があります。   アセンブリ言語やマシン語の知識も必要となってきます。   「メモリ」に対する考え方を経験する必要がありそうです。

shutalui77
質問者

お礼

>C言語の「ポインタ」は、「物理」なメモリを意識する必要があります。   アセンブリ言語やマシン語の知識も必要となってきます。   「メモリ」に対する考え方を経験する必要がありそうです。 メモリに対する考え方ですね! 一直線にポインタを勉強するより遠回りしてメモリの考え方から勉強した方が 知識が深まりそうですね。 非常に参考になりました。ありがとうございました。

関連するQ&A

  • スタックポインタをC言語で記述する方法は?

     スタック・ポインタの設定はアセンブラで記述してリンクしていますが、C言語で記述する一般的な方法は有りますか。  ルネサスのHEWだと出来るようですが、コンパイラ依存性が有るようです。  コンパイラに依存しないか、たいていのコンパイラなら出来る方法は有りますか。  宜しくお願いします。  

  • C#で、Cのファイルポインタ(?)のような機能

    プログラムの初心者、かつ、C#の初心者です。  C言語では、ファイルポインタを関数から関数へ渡すことができると思うのですが、C# ではどのようにすれば良いのですか? C#を使っていますが、C言語のような構造でプログラムを書いています。  やりたいことは、ファイルポインタを渡しながら、各関数で、ドカドカと計算結果をファイル内に書いていくということです。  宜しくお願いいたします。

  • C言語のポインタについて

    C言語のポインタ(配列もポインタに含まれるのか?)について質問です。 係数を行列形式で表される状態方程式などの2変数以上の方程式を解くプログラムにおいてよくポインタや配列が使われているのですが、なぜポインタや配列を使うのでしょうか?利点など詳しく教えていただけませんでしょうか。。。 どなたか分かる方よろしくお願いします(*_*)

  • C言語のポインタのどのあたりが難しいと思いますか?

    C言語のポインタは初心者にとって大きな壁であるとよく言われます。 具体的にポインタのどのあたりが難しいと思いますか? 経験者の方、初心者の方などいろんな意見をお聞かせください。 ちなみに私もポインタでつまづいた人間の一人です。 つまづいた箇所は一箇所ではないのですが、例を挙げるなら int *p; p = &a; *p = a; で pと *pの違いがわからなかったですね…。\0とNULLの違いもごっちゃになっていましたし。 似たような表記だけど意味は違う、という箇所にひっかかっていました。 ポインタがどのようなものなのかというイメージは理解しやすかったのですが…。

  • C言語のポインタについて教えてください。

    C言語のポインタについて教えてください。 ・pointer1.c  int main(){   int a;   int *p;   p = &a;     a = 123;   printf("%d", *p);   return 0;  } ・pointer2.c   int main(){ int a[100]; int *p; p = &a[0]; int i; for(i = 0; i < 100; i++) a[i] = i; for(i = 0; i < 100; i++) printf("%d", *p++); return 0; } と二つのソースコードがあるとき、pointer2.cの「p = &a[0]」をpointer1.cのように「p = &a」と書けないのはなぜですか?  また、「&a」は動かすことのできなく、「aを指し示す*p」は動かすことができる変数のようなもの、という認識に誤りはないでしょうか?  宜しくお願いします。

  • 関数ポインタの利点

    こんにちは。 C言語初心者ですが今勉強中です。 その中でポインタについては理解できたのですが、 関数ポインタの利点、使うべき所などが理解できません。 ポインタの基本は理解しています。 値渡し、アドレス渡しも理解しています。 関数ポインタを使うと何がいい、またはどんなとき使わなければならないのか 教本を読んでいてもさっぱりわかりません。 サンプルプログラムを打っても何のために使ってるのかわからないです。 どなたか教えていただけませんでしょうか? よろしくお願いします。

  • C# 再帰よるスタックオーバーフローについて

    VB2008 C# でプログラムしていますが、 プログラムで再帰を多く行わなくてはならず、 スタックオーバーフローが出てしまいます。 スタックオーバーフローを解決するためには、アルゴリズムを変更し、 再帰の回数を減らすしか方法はないのでしょうか? もしスタックの上限を変更する方法などがありましたら教えてください。 VBは初心者なので、なるべく簡単にお願いします。

  • 関数へのポインタ

    超初心者です。 C言語を使ってsin波を生成して音を鳴らそうとしているのですが・・ネットで調べてもよくワカリマセン・・ 超初心者な私でも理解できるようなサイトを教えて下さい. また、関数へのポインタも勉強しているのですが, char *(*func)(void); といったchar 型へのポインタを返す関数へのポインタというのがあったとして,関数へのポインタは理解できたのですがさらにchar 型へのポインタとなると一体これが何を指しているのかさっぱりで・・・・ ご協力お願いします.

  • C言語のポインタに直接アドレスを割り振りしたい

    C言語のポインタに直接アドレスを割り振りしたいのですが、どうしたら良いのでしょうか?

  • C言語に関することについて教えてください

    学校の問題集にでてきた問題がわかりません、どうか教えてください 1 プログラムの役割、必要性について説明せよ 2 プログラムにおける変数と定数の役割を説明せよ。また、ローカル変数の有効な範囲について説明せよ。 3 C言語で使う変数が他について、宣言子と、printf関数、scanf関数それぞれにおいて対応する書式指定子を対応表にせよ。また、変数名を決める際に守るべき文法上の規則と、プログラマとして配慮すべき事項を説明せよ。 4 配列について、その役割と定義方法を説明せよ。 5 コンピュータにおける文字処理に必須なアスキーコードについて説明せよ。 6 C言語における文字列について、文字列定数、文字列変数を説明せよ。 7 C言語における繰り返し処理の文法(for,while,do~while)を、プログラムコード列を示して説明せよ。 8 C言語における条件判断の文法(if,else,else if)を、プログラム列を示して説明せよ。 9 繰り返し、条件判断において利用する論理式(等値演算子、関係演算子、論理演算子等で記迷する式)について、その記迷の方法を論理和、論理積も含めて説明せよ。 10 変数のアドレスについて説明せよ。また、ポインタについて、アドレスとの関連性を踏まえて、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 11 ポインタと配列の関係について、ポインタによる配列操作を列に説明せよ。 12 関数について、その役割と定義方法について説明せよ(戻りがた、関数名、引数リスト)。また、自作関数をそれらを利用するmain関数のプログラムコード例を示せ。 13 scanf関数の戻り値について、その内容を説明して、どのような際に利用すると便利か、プログラムコード例を示して説明せよ。 14 引数にポインタを利用する関数のプログラムコード例を示して、ポインタの必要性、重要性を説明せよ。 15 構造体について、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 16 ファイルポインタについて説明し、ファイル入出力の方法についてプログラムコード例を示して説明せよ。

専門家に質問してみよう