- ベストアンサー
C言語のポインタとスタックポインタ
プログラム始めて1ヶ月の初心者です。 C言語のポインタとスタックポインタというのは同じなのでしょうか。 スタックポインタの考えは大体理解出来たのですが C言語のポインタとなるとコードを見てもサッパリ分かりません。 ネットで調べても出てこなかったのでどなたか教えて下さい。 よろしくお願いします。
- shutalui77
- お礼率56% (28/50)
- C・C++・C#
- 回答数6
- ありがとう数7
- みんなの回答 (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
その他の回答 (5)
- titokani
- ベストアンサー率19% (341/1726)
>C言語のポインタとスタックポインタというのは同じなのでしょうか。 違うものです。 >スタックポインタの考えは大体理解出来たのですが >C言語のポインタとなるとコードを見てもサッパリ分かりません。 違うものなので、サッパリ分からなくても当然です。 >ネットで調べても出てこなかったのでどなたか教えて下さい。 普通は比較する対象ではないので、ネットで調べても出てこないでしょうね。 でも、「メモリのどこかを指す」という点はいっしょなので、スタックポインタが本当に理解できているのなら、ポインタの理解もたやすいと思いますよ。
お礼
そうなんですか。ありがとうございました。 引き続きポインタの勉強に励むことにします。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★補足要求します。 スタックポインタとは 1...C言語でスタック・データ構造を組んでPush、Popのポインタを意味するのか? 2...CPUプロセッサのレジスタの1つにあるスタック・ポインタ(sp)を意味するのか? どちらですか? ここがハッキリしないと誰も適切な回答が出来ません。 ソースなども含めて補足して下さい。
補足
言葉足らずですみませんでした。 私が言おうとしていたのは >2...CPUプロセッサのレジスタの1つにあるスタック・ポインタ(sp)を意味するのか? のことです。
- neKo_deux
- ベストアンサー率44% (5541/12319)
> スタックポインタの考えは大体理解出来たのですが プロセッサのレジスタの一つですね。 > C言語のポインタ C言語の中のポインタ型の変数です。 土俵が違うし、そのポインタと言う言葉自体、直接的には別のものを指します。 辿り辿って行けば同じものである場合もありますが、質問文の書き方では別物です。
お礼
普通はそんなに辿るものではないですよね。 ありがとうございました。
- gatyan
- ベストアンサー率41% (160/385)
別物です、たぶん スタックというデータ構造がありますが、その説明の部分で出てきていて、データの読み書きにstack[sp]の様に配列を使うなら、スタックポインタとは呼ばれますが int や long など整数型の変数になります ポインタの練習を兼ねているような場合は、ややこしいですが…C言語のポインタということになります *spでスタック上のデータにアクセスしてsp++やsp--でPush/Popを実現しているとか 関数の呼び出しや、変数がどのように管理されるかのような部分で出てきたのなら、CPUのデータ管理の仕組み・スタックを管理するためのもの(レジスタ)を意味します
お礼
どう違うのかが分かりました。詳しく説明して頂きありがとうございました。
- auty
- ベストアンサー率58% (284/486)
・ 「ポイント」と言うのは、「指す」ということです。 ・ C言語の「ポインタ」と言うのは、普通、[メモリのアドレス]を指します。 ・ 「スタックポインタ」と言うのは、スタックの特定位置を「指す物」ということですね。 ・ C言語の「ポインタ」は、「物理」なメモリを意識する必要があります。 アセンブリ言語やマシン語の知識も必要となってきます。 「メモリ」に対する考え方を経験する必要がありそうです。
お礼
>C言語の「ポインタ」は、「物理」なメモリを意識する必要があります。 アセンブリ言語やマシン語の知識も必要となってきます。 「メモリ」に対する考え方を経験する必要がありそうです。 メモリに対する考え方ですね! 一直線にポインタを勉強するより遠回りしてメモリの考え方から勉強した方が 知識が深まりそうですね。 非常に参考になりました。ありがとうございました。
関連するQ&A
- スタックポインタをC言語で記述する方法は?
スタック・ポインタの設定はアセンブラで記述してリンクしていますが、C言語で記述する一般的な方法は有りますか。 ルネサスのHEWだと出来るようですが、コンパイラ依存性が有るようです。 コンパイラに依存しないか、たいていのコンパイラなら出来る方法は有りますか。 宜しくお願いします。
- ベストアンサー
- C・C++・C#
- C#で、Cのファイルポインタ(?)のような機能
プログラムの初心者、かつ、C#の初心者です。 C言語では、ファイルポインタを関数から関数へ渡すことができると思うのですが、C# ではどのようにすれば良いのですか? C#を使っていますが、C言語のような構造でプログラムを書いています。 やりたいことは、ファイルポインタを渡しながら、各関数で、ドカドカと計算結果をファイル内に書いていくということです。 宜しくお願いいたします。
- 締切済み
- C・C++・C#
- C言語のポインタについて
C言語のポインタ(配列もポインタに含まれるのか?)について質問です。 係数を行列形式で表される状態方程式などの2変数以上の方程式を解くプログラムにおいてよくポインタや配列が使われているのですが、なぜポインタや配列を使うのでしょうか?利点など詳しく教えていただけませんでしょうか。。。 どなたか分かる方よろしくお願いします(*_*)
- ベストアンサー
- C・C++・C#
- 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++・C#
- C# 再帰よるスタックオーバーフローについて
VB2008 C# でプログラムしていますが、 プログラムで再帰を多く行わなくてはならず、 スタックオーバーフローが出てしまいます。 スタックオーバーフローを解決するためには、アルゴリズムを変更し、 再帰の回数を減らすしか方法はないのでしょうか? もしスタックの上限を変更する方法などがありましたら教えてください。 VBは初心者なので、なるべく簡単にお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- 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 ファイルポインタについて説明し、ファイル入出力の方法についてプログラムコード例を示して説明せよ。
- 締切済み
- その他(インターネット接続・通信)
お礼
ありがとうございます。 とても分かりやすかったです。参考サイトよく見てみます。