質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

4回答

802閲覧

PHPにおける配列等の内部ポインタは、何をもって指定されているのですか?

WeilSpinor

総合スコア170

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2019/03/28 12:54

主にnext()関数等の内部配列ポインタ操作系関数や、fgetcsv()等のファイル操作系関数において、『内部ポインタ』という概念が出てきます。

意味合いとしては、読んで字が如く、
「配列やファイルの中身の読み込みや書き出しをする際の開始・終了位置を指定するカーソル」
ということです。

では、その、
「注目している配列(ファイル)内部のカーソルの現在位置」は何処かに記録されているはずですが、どこにどう記録されているのでしょうか?

例えばC言語だと、変数や配列(ファイル)のデータは全てメモリ上のアドレスを参照する言語ですから、

たとえば、
配列aryの内部のカーソルの現在位置は、
配列aryが占めているメモリ領域内部のアドレス値で指定されて、
ポインタ変数*aryに自動的に格納されている、

という感じに、とてもシンプルに理解できます。(コンソール上で実際に確認できて分かりやすいです)

しかし、phpでは、マニュアルによると、どうもそういう単純な仕組みではないようです。
phpマニュアルにポインタについての説明はなかったし、
『リファレンス』の項目を見ても、
「変数に対する変数のリファレンスは、ファイル名に対するファイルそのもの、のようなものであり、それ以上でも以下でもない。c言語のポインタとは違う。よってポインタ演算のようなことはできない。」みたいなことを言っているだけで、具体的な仕組みについては触れていませんでした。

phpの内部ポインタは、何をもって指定されるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

「注目している配列(ファイル)内部のカーソルの現在位置」は何処かに記録されているはずですが、どこにどう記録されているのでしょうか?

PHPを使う以上は、考える必要はありません。それは、「PHP自体を開発する」、あるいは「PHP向けのC言語エクステンションを書く」人の世界です。

PHP自体の開発に携わりたい、あるいはマニュアルに書いてあるように動作しない、はたまた内部構造に引きずられて速度が出ないなど、その内部構造に依存して困っている、という状況でなければ、PHP内部はブラックボックスと考えて先に進んでください。PHPのプログラミングをマスターしてから戻ってきても遅くありません。

投稿2019/03/28 13:33

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WeilSpinor

2019/03/28 13:48 編集

ご回答ありがとうございます。 細かいことは考えるつもりはなかったのですが、 ファイル操作を勉強しているときに、ファイル操作系の関数は、基本的に、 「ファイルポインタを返す」 ということだったので、 「ファイルポインタの挙動や、ファイルポインタは何に格納されているのか、については当然知っておかなければいけないのかもしれない」 と思い、質問に至りました。 調べれば簡単なことかと思っていたのですが、C言語のようにシンプルなわけではないみたいですね。 (スクリプト言語という高度な言語、ということを考えれば、当然かもしれません) しかし、あまり考えるべきでないならば、無視しようと思います。
maisumakun

2019/03/28 13:50

他の回答にコメントしたこととも重なりますが、実際のファイル操作は「OS依存」です。つまり、その実態は環境によって違ってきます。 PHPの標準ライブラリがその詳細の差を隠して、どのOSでも同じように使えるようにしてくれています。拡張や他言語の呼び出しなどでPHPを飛び出す場合、あるいはパフォーマンス上考慮する必要がある場合を除けば、「PHPが見せている世界」の裏側を考えても使いみちがありません。
maisumakun

2019/03/28 13:58

そして、内部構造は突然変わることもあります(PHP 5からPHP 7になったときに、変数などの内部構造も一新されています)。そのような改良を行ってもPHPコードに影響を与えないように、内部構造はPHPコードからは「あえてアクセスできない」ようにされている部分もあります。 このように、使う側に内部構造を見せないことを「カプセル化」といいます。
guest

0

そんなに知りたいのならPHPのソースを読めばいいです。
私はほとんど読めませんが、質問者さんが例えで出されているC言語が基軸ですよ。

投稿2019/03/28 13:00

m.ts10806

総合スコア80848

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/03/28 13:31

直接の回答じゃないので低評価はある程度覚悟してましたけど、 ということは、低評価した方の回答期待して良いってことですよね。楽しみにしておこう。 この質問者を最後までまともに質問サイトで相手にできる自信もあるんでしょうか。。。
maisumakun

2019/03/28 13:34

どうしても気になるならこの手段が正しいですね(+1)
m.ts10806

2019/03/28 13:38

ありがとうございます。 この方、屁理屈と思い込みばかりで全くPHPコード書く様子がないので、無駄な時間過ごしてるなという感覚ですね。本当にプログラミング言語作るつもりで質問してるならすごいなとは思うのですが、そのつもりはなさそうなので。
maisumakun

2019/03/28 13:44

C言語レベルですら、ファイル内の位置はFILE *の先にあって、プログラマには(表向き)操作関数だけが提供されているような感じですし、PHPから見ればはるかかなた…といった感じですね。
m.ts10806

2019/03/29 00:37

PHP組むなら標準機能はINPUT/OUTPUTだけPHPマニュアルでチェックすればあとは「そういうもの」で済むとは思うのですけどね・・。
guest

0

ファイルポインタであれば、ファイルハンドル(fgetcsvの第一引数)の中にあります。PHPはCで書かれているでしょうから、FILE構造体、つまりLinuxであれば、/usr/include/libio.hの中のstruct _IO_FILEの内容が含まれていると思います。

投稿2019/03/28 14:00

otn

総合スコア84498

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WeilSpinor

2019/03/28 22:49

ご回答ありがとうございます。参考にさせていただきます
guest

0

自己解決

ご回答ありがとうございます。
少し理解が深まりましたが、はっきりは理解できてなさそうなので、また今度本か何かで勉強します。
とりあえず、サーバーマシンは役所のようなものと考えておきます。

投稿2019/03/30 08:34

WeilSpinor

総合スコア170

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問