• ベストアンサー

ポインタのポインタ

YOKO-beeの回答

  • YOKO-bee
  • ベストアンサー率50% (2/4)
回答No.5

何に使うか・・・難しい質問ですよね。 使い道について、「文字列の配列の受渡し」に使うという表現が 個人的にしっくりきます。 一例ですが、*week[]={"月曜","火曜","水曜","木曜","金曜",NULL};と ポインタ配列を作成して、表示関数へポインタのポインタで渡します。 この時、作成者が同じかインターフェイス設計が確定していれば、 固定長の2次元配列で渡せるかもしれませんが、エディタなどを 作成する場合は固定長という訳にはいきません。(たぶん(-_-;)) 一例を元にサクッと書いたソースです。 (全角スペースは置換してください。) /*--------------------------------------------- #include <stdio.h> void dspout(char **); int main() {  char *week[] = {"Sunday","Monday","Tuesday","Wednesday",           "Thursday","Friday","Saturday",NULL};  dspout(week);  getchar();  return 0; } void dspout(char **pweek) {  for(;*pweek!=NULL;pweek++)  {   printf("%s\n",*pweek);  } } ------------------------------------------*/ このプログラムを実行してアドレスの動きを見ていくと、なんとなく 「文字列の配列」の受渡しに使うと効果があるって事がわかるんじゃ ないか~と思います。(ちょっと投げやりで、すいません) karasu4649さんの例えだと、確かに「ポインタ」でいいじゃないか? とも思うんですけど、文字列の配列を全部表示・処理する場合に有効 ということで、私は考えております。 かなり私見ですが、お役に立てれば幸いです。<(_ _)>

関連するQ&A

  • ポインタを使った構造体のプログラム

    ポインタを使ってメンバに値を入力して表示するプログラムを作ったのですが、mainのstruct XYZ aというオブジェクトと*bというそれを指すポインタを使ってプログラムを表示するにはどうすればいいのでしょうか。 これがプログラムです。 #include <stdio.h> struct XYZ { int x; long int y; double z; }; void set_xyz(struct XYZ *p,int x,long int y,double z) { p->x=x; p->y=y; p->z=z; } //void set_xyz(struct XYZ *,int,long int,double); int main() { struct XYZ a = {12,999999,1.41421356},*b; //ここのポインタ変数bでエラーが表示されます。 set_xyz(b,a.x,a.y,a.z); printf("a.x = %d\na.y = %d\na.z = %lf\n",b->x,b->y,b->z); return 0; } エラーの内容は「初期化されていないローカル変数 'b' が使用されます」となっています。 初歩的な質問ですみません・・・。

  • ポインタに関するトラブル

    pointという座標を表す変数x,y,zつ保持するクラス型があったとして point *a = point型のポインタを返す関数(); という式を作ったんですが、なぜか、 右辺と左辺はどちらのポインタも指すアドレスは確実に同じなのに。 値を参照しようとすると違う結果が出ます。具体的には 右辺から参照した結果が 50(正しい結果) (*a).x を表示した結果 左辺から参照した結果が -9.25596e+061(?) (*point型のポインタを返す関数()).x を表示した結果 という結果で、完全に同じアドレスを保持するポインタなのに 実行した結果が違って混乱しています。まったく原因がわかりません 説明不足で申し訳ありませんが、なにが問題か分かる方がいらっしゃったらお願いしますm(_ _)m

  • 親クラスのポインタ、クラスを指定しないポインタ

    親クラス A (抽象メソッドX、Yの2つを持つ) と 子クラス B-1 (親はA、抽象メソッドX、Y、Zの3つを持つ) 子クラス B-2 (親はA、抽象メソッドX、Y、Wの3つを持つ) のように、子クラスでポリモーフィズムを実現しているとき、 クラスC   「実行時に、iniファイルに(1)と書かれていたら、B-1のクラスで実体化し、   iniファイルに(2)と書かれていたら、B-2のクラスで実体化する」  というクラスを作りたいです。 //////////////////////////////////////////////////////////////// 質問(1) その際、クラスCは、どうやってもZのメソッドや、Wのメソッドは書けない認識です。 (メソッド名もiniファイルから取るようにすれば別でしょうが。) この認識であっていますでしょうか? 質問(2) 逆に、XとYについては、それぞれ挙動の違う処理を行わせることができる認識です。 (クラスCで、親クラスAのポインタ型の変数を用意しておき、  そのポインタに、DLLのインスタンス化したものをいれておけば、  メソッドXとYについては実行可能という認識です)

  • 配列とポインタについて

    #include <stdio.h> int main() { char x[3]; char *y; x[0]='a'; x[1]='b'; x[2]='\0'; y="abc"; printf("xの値は%s\n",x); printf("yの値は%s\n",y); } 通常の配列宣言では、このままだと文字列をまとめて 代入できないのに対して、ポインタ変数ならまとめて代入することができるのは何故ですか?そういう仕組みだと言われてしまえば、それまでなんですが・・・

  • テイラー展開

    z=(1-x^2-y^2)^(1/2)について、x=y=1/2において、xが0.002増加し、yが0.001減少するときzはどれだけ変化するか。ただし、有効数字1ケタで求めよという問題です。 これを2変数についてのテイラー展開を行い、求めるのではないかと考えていますが、どこまでの展開項を用いればよいでしょうか? 解説等もあわせてお答えいただけるとありがたいです。 よろしくお願いします。

  • newされたポインタとdeleteされるポインタが…

    いま私は、std::mapを使って、newされたポインタ(メモリの先頭アドレス)をkeyとして記録し、newされた場所のファイルや行番号、サイズ、何回目のnewか、などなどをvalueとして構造体にまとめて保存してデバッグなどに役立て、deleteされると同時にこの情報を破棄し、最後にすべて破棄されているかどうかを調べる(メモリリークのチェック)という機構を作っています。 ですが、keyとなっているメモリのアドレスは、多重継承や仮想継承とキャストの組み合わせ次第では、newされた時点のものとdeleteされる時点のもので異なっている場合があるため、情報を破棄することができず、行き詰ってしまいました。(無論、delete以外にも情報を引き出す際に影響が…) deleteするポインタから、そのポインタがnewで作成されたときのメモリの先頭アドレスを求める方法はないでしょうか? 以下に問題の部分だけ抽出したようなコードを挙げます。 ---------------- #include <stdio.h> class CLS1{ public: int x,y,z; virtual ~CLS1(){} }; class CLS2{ public: int x,y; virtual ~CLS2(){} }; class CLS3:public CLS1, public CLS2{ public: int x; virtual ~CLS3(){} }; void print(void* p){printf("%p\n",p);} template<typename T> T* create(T* p){ // ここで、たとえば 00854880 と記録されたとして… print(p); return p; } template<typename T> void releace(T* p){ // ここでも 00854880 と記録されてほしいが、 // 00854890 と記録されてしまう。 // この場所で 00854880 と同じインスタンスであることを確かめる方法はないでしょうか? print(p); delete p; } int main(){ CLS2* x = create(new CLS3); // 多重継承しているため、 00854890 と記録される。 print(x); release(x); return 0; }

  • 郵貯の暗証番号…

    つい3日前に郵貯(ぱるる)で口座開設をしました。 カードも作ったのですが、暗証番号を忘れてしまったのです…。 カードは今日送られてきたんですが、暗証番号は書いてありませんでした。まだ他に書類が届くんでしょうか? 4桁の暗証番号で上3桁までは分かるんですが下の1桁がどうだったか分かりません。 ATMなどで一定回数暗証番号を間違えるとまた窓口にハンコを持って行かなきゃいけないみたいですが、一定回数とは何回なんでしょう?一応、これかなって思う番号が4つあるんです。 よろしくお願いします。

  • ゆうちょ通帳の引き出しができない

    引き出しをしたいのにATMにいったら暗証番号がちがうと表示されました 前はできてたのに 先月暗証番号をわすれ紙を送ってもらったからでしょうか?

  • 台湾の銀行口座暗証番号の桁数について

    台湾在住していた2015年に、「國泰世華銀行」と「中國信託銀行」で普通預金口座を開設して、キャッシュカードでATMでの入出金を行っていました。 その後帰国して長らくATMも使用して無かったのですが、近々台湾旅行で預金を使おうと思ったのですが・・・・、お恥ずかしながら暗証番号を失念してしまいました。開設当初は銀行からの仮暗証番号をもらい、すぐに自分で暗証番号改変して使ってました。メモ帳には、他の国のキャッシュカード暗証番号と混在して、8桁の数字と4桁の数字があり、多分どちらかと思います。台湾はどの銀行も8桁と思ってましたが、4桁、6桁、8桁と言う人もおり、各銀行での違いがあるかもしれません。 どなたか、「國泰世華銀行」「中國信託銀行」のキャッシュカードをATMで使う時に、8桁番号かどうか、桁数を教えてもらえませんか。よろしくお願いします。

  • ポインタの基礎的なこと

    #include <stdio.h> int main() { char *a; *a='X'; printf("%c\n", *a); return 0; } 実行すると、"X"がきちんと出力されるんですが、 この場合"X"という文字が格納されている場所(ポインタが指し示している場所)は、メモリが確保されていないので、もっと長いプログラムになった場合に、この"X"が格納されている場所は、ほかの変数の領域に割り当てられたりして使われてしまう可能性があるということなんでしょうか?